Re: [問題] 一些關於數學的問題
※ 引述《Accelsynchro (none)》之銘言:
< 恕刪 >
: A[1] A[2] A[n]
: f(x)=A[0]+ ── + ── +...─────
: x x^2 x的i次方
: 使用者可以輸入一連串的整數n A[1] A[2]...A[n]
: 誤差則設定在10^-4以下
< 恕刪 >
數值分析之絕對誤差 1**-4 可以是 x 誤差, or f(x) 誤差,
不同演算法挑用誤差不多, 先定義你的誤差為何。
嚴格來說,你的 code 應該連 compile 都有問題。
: 以下是部分的程式碼
< 恕刪 >
: int a[];
陣列不能這麼宣告。
: for(i=0,i<=n,i++){
正常而言,這裡應不會是等於 n
: scanf("%d",&a[i]);
你的 a[i] 確定是 integer 吧?
: fx=fx+a[i]/x^i;
這個有人點出來了。x^i , 可以調用 math.h 裡之 pow() function,
不過蠻建議上網找 fast power 怎麼寫的,
math.h 只針對 exopment 不為整數時,速度才快,
其他方法你隨便亂寫 (普通慢慢累乘) 都會比他快。
綜合以上程式碼,建議先再把 C language 看一遍。
: 我後來去問自己身邊學過的人
: 他說可以寫一個類似勘根定理還是十分逼近法的for迴圈
: 然後慢慢代入x的值
慢慢代入?他只學過 C 語言而已吧?
: 可是我只假定出double low 跟dowble up之後就不知道怎麼寫了冏
假設欲求 f(x) = 0, 也假設題意是給你說從 (-∞, +∞) 中求一個根。
勘根定理是輔助,只能先確定「根的範圍」,
如在 [1,100] 間 (可能) 有一個根,或在 [1,2] 間 (可能) 有一個根,
接下來才能再拿其他的方法
拿到範圍後,才繼續用數值分析的 「非線性方程式求解」 之相關演算法求根。
( 個人給它較完整的名稱是 「實數係單變數 非線性方程式求解」 )
但如果題意已經告訴你,[2,3] 之間有一個根的話,就不用再套用勘根定理。
其他勘根定理的說明可再 google,或可看這裡。 http://ppt.cc/rrtm
十分逼近法可以做,但效果可能只比暴力法好一點,
有很多效果很好的數值方法,但都有其缺點,而且缺點不少。
目前被探討最多的是 二分法、牛頓法,效果好一些的方法是 Muller,但也很難寫。
個人比較建議直接拿二分法用就好了,速度(可能)比其他方法慢一點點而已,
不過會遇到的問題會少很多。
其他各方法整理與 code http://ppt.cc/kFWC
裡面的 double func(double x); 系列函式和你的問題有些不同,
作法了解後要改應無大礙,加油。
--
我知道 ~ 但別說出來 ,
說出來讓人感到特別難過...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161
討論串 (同標題文章)
完整討論串 (本文為第 2 之 4 篇):
問題
3
16