1樓:PikaPikachu
函式求根的話,第乙個想到的是二分法
先把原方程化簡一下:
令 寫了乙個python程式算了一下:
import math
def f(x):
return x**2-0.9*math.sin(math.pi*x)
a=0.5
b=1i=1
while I<=20:
mid=f((a+b)/2)
if mid*f(b)<0a=(a+b)/2
elseb=(a+b)/2
print(i,a,b,sep=' ')
i+=1
結果如下:
1 0.75 1
2 0.75 0.875
3 0.75 0.8125
4 0.75 0.78125
5 0.765625 0.78125
6 0.765625 0.7734375
7 0.76953125 0.7734375
8 0.76953125 0.771484375
9 0.7705078125 0.771484375
10 0.7705078125 0.77099609375
11 0.7705078125 0.770751953125
12 0.7705078125 0.7706298828125
13 0.77056884765625 0.7706298828125
14 0.770599365234375 0.7706298828125
15 0.7706146240234375 0.7706298828125
16 0.7706222534179688 0.7706298828125
17 0.7706222534179688 0.7706260681152344
18 0.7706222534179688 0.7706241607666016
19 0.7706222534179688 0.7706232070922852
20 0.7706222534179688 0.770622730255127
大概在第16次迴圈的時候得到比較準確的數值解,這個用計算器按的話還是比較費勁的
有沒有什麼更快的方法呢?有的!
接下來請出牛頓大神:牛頓迭代法
先看看這個函式的影象:
在 上, 不變號,都大於零
個人覺得 這個點比較順眼,就選它開始迭代
近似根的迭代公式:
取 ,則
這樣看來牛神的方法就比二分法的速度快了很多,我自己按計算器迭代了3次就差不多有很準確的結果了
繼續上python程式:
import math
def f(x):
return x**2-0.9*math.sin(math.pi*x)
def df(x):
return 2*x-0.9*math.pi*math.cos(math.pi*x)
i=1a=1
while i<=10:
a=a-f(a)/df(a)
print(i,a,f(a),sep=' ')
i+=1
設 的精確解為 ,誤差為 ,有公式
,所以結果如下:
1 0.7928505854813077 0.08338626024554607
2 0.7711084697337774 0.0017821387346091955
3 0.7706228210147352 9.262434513823692e-07
4 0.7706225683424206 2.509104035652854e-13
5 0.7706225683423521 -1.1102230246251565e-16
6 0.7706225683423521 -1.1102230246251565e-16
7 0.7706225683423521 -1.1102230246251565e-16
8 0.7706225683423521 -1.1102230246251565e-16
9 0.7706225683423521 -1.1102230246251565e-16
10 0.7706225683423521 -1.1102230246251565e-16
基本上到第3次的結果就比較精確了,所以說牛頓迭代法逼近根的速度快,用計算器按的話,個人感覺,還是用牛神的方法簡便快捷。
對了,這個函式還有乙個不起眼的零點,0
這個應該能猜出來吧,差點忘了