第一部分:趣味演算法入門;第六題牛頓迭代法求一元三次方程的根
- 2020 年 3 月 17 日
- 筆記
100個不同類型的python語言趣味編程題
在求解的過程中培養編程興趣,拓展編程思維,提高編程能力。
第一部分:趣味演算法入門;第六題
''' 6.牛頓迭代法求方程的根:方程為:ax**3 + bx**2 + cx + d = 0,係數a,b,c,d由主函數輸入。 求x在1附近的一個實根。求出根後,由主函數輸出。 牛頓迭代法的公式是:x = x0 - f(x0)/f'(x0) 設迭代到|x-x0|<=10**-5時結束。 ''' #解題方法示例如下; #輸入方程的係數 a = int(input('請輸入a的值:')) b = int(input('請輸入b的值:')) c = int(input('請輸入c的值:')) d = int(input('請輸入d的值:')) #用牛頓迭代法求方程的根 x = 1.5 i =1 #隨機定義一個i的值,是其能夠進入while循環語句 while i >= 1e-5: #(1e-5 = 10**-5) x0 = x #用所得的x代替x0原來的值 f = ((a*x0+b)*x0+c)*x0 +d #f用來描述方程的值 fd = (3*a*x0 + 2*b)*x0 +c #fd用來描述方程求導之後的值 x = x0 - f/fd #求得更接近方程根的x的值 i = abs(x - x0) #輸出所求方程的根 print('方程的一個根為:{:7f}'.format(x)) #format的格式化輸出,輸出保留7位小數的浮點數。 #解本問題有多種方法,此方法並不是標準答案,讀者可以自己嘗試各種方法 問題分析:
牛頓迭代法是取x0之後,在這個基礎上,找到比x0更接近的方程的根,一步一步迭代,從而找到更接近方程的近似根。
設r是f(x)=0的根,選取x0作為r的初始近似值。過點(x0, f(x0))作為曲線y = f(x)的切線L,L的方程為y = f(x0) +f『(x0)(x-x0),求出L於x軸交點的橫坐標x1 = x0 -f(x0)/f』(x0),稱x1為r的一次近似值,過點(x1, f(x1))作為曲線y = f(x)的切線並求改切線於x軸的橫坐標x2 = x1 -f(x1)/f』(x1),稱x2為r的二次近似值,重複以上過程,得r的近似值xn。上述即為牛頓迭代法的求解過程。
演算法設計:
- 在1附近找任意一實數作為x0的初值,我們去1.5,即x0 = 1.5.
- 用初值x0帶入方程中計算此時的f(x0)及f'(x0);程式中f用來描述方程的值,fd用來描述方程求導之後的值。
- 計算增量h=f/fd。
- 計算下一個x (x = x0-h)。
- 用所得的x代替x0原來的值。
- 若|x - x0|>=1e-5,則轉到第三步繼續執行,否則轉到步驟7
- 所求x就是方程的根,將其輸出。
如果你喜歡我的文章,請滑到下方點個推薦再走. ,以給我動力哦;轉載請注名出處。然後..請多來做客鴨。
註:100個不同類型的python語言趣味編程題是參考100個不同類型的c語言趣味編程題而寫,陸續會更新。歡迎大家分享出你們的方案。
