天天看點

牛頓法求方程的根(C&Matlab&Python語言實作)

目錄

​​1、概述​​

​​2、案例​​

​​3、程式源代碼​​

​​(1)C語言實作 ​​

​​(2)Matlab實作​​

​​(3)Python實作​​

​​ (4)Python中Sympy庫​​

​​4、總結   ​​

​​5、參考文獻 ​​

1、概述

牛頓法求方程的根(C&Matlab&Python語言實作)

      詳細知識點我在前面的​​牛頓疊代法開方​​已經總結啦,這裡就稍做補充。下面我們就直接給出案例,然後分享代碼和結果。 

牛頓法求方程的根(C&Matlab&Python語言實作)
牛頓法求方程的根(C&Matlab&Python語言實作)

2、案例

牛頓法求方程的根(C&Matlab&Python語言實作)

3、程式源代碼

(1)C語言實作 

#include<stdio.h> 
#include<math.h> 
int main() 
{
double pow(double x,double y);
double x0,x,f1,f2; 
x0=1; 
do
{ 
  x=x0; //初值 
  f1=pow(x,7)-28*pow(x,4)+14; 
  f2=7*pow(x,6)-112*pow(x,3); //對函數 f1 求導 
  x0=x-f1/f2; //疊代公式 
} 
while(fabs(x0-x)>1e-5); 
printf("%9.8f\n",x0); 
return 0; 
}      

​​[注]C語言中math.h的全面總結​​。

牛頓法求方程的根(C&amp;Matlab&amp;Python語言實作)

(2)Matlab實作

%Newton 疊代法 
x=1; 
while abs(x.^(7)-28*x.^(4)+14)>0.00001 
      x=x-(x.^(7)-28*x.^(4)+14)/(7*x.^(6)-112*x.^(3)); 
end 
vpa(x,8)      

​​[注]Matlab中vpa()函數的應用。​​(本例中精度為保留8位有效數字)

牛頓法求方程的根(C&amp;Matlab&amp;Python語言實作)

(3)Python實作

import numpy as np
from sympy import *
import matplotlib.pyplot as plt
plt.style.use('ggplot')     #設定繪圖風格
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']   #進行中文亂碼
plt.rcParams['axes.unicode_minus']=False                #坐标軸負号的處理

x = symbols('x')
x1= 0  #區間下限
x2= 0.11  #區間上限
x0 = (x1+x2)/2  #疊代初始值
x_list = [x0]
i = 0

def f(x):
    f = x**7-28*x**4+14
    return f

x_values = []
y_values = []
while True:
    if diff(f(x),x).subs(x,x0) == 0:    #導數為零
        print('極值點:',x0)
        break
    else:
        x0 = x0 - f(x0)/diff(f(x),x).subs(x,x0)  #diff()求導,subs()指定位置求導
        x_list.append(x0)
    '''if len(x_list) > 1:
        i += 1
        error = abs((x_list[-1] - x_list[-2]) / x_list[-1])
        if error < 10 ** (-6):
            print(f'疊代第{i}次後,誤差小于10^-5')
            break
    else:
        pass'''
    #誤差為零時:
    if len(x_list) > 1:
        i += 1
        error = abs((x_list[-1] - x_list[-2]) / x_list[-1])
        x_values.append(i)
        y_values.append(error)
        if error == 0:
            print(f'疊代第{i}次後,誤差等于0')
            break
    else:
        pass

print(f'所求方程式的根為{x_list[-1]}')

#橫坐标是疊代次數,縱坐标是誤內插補點
plt.plot(x_values,
         y_values,
         color = 'steelblue', # 折線顔色
         marker = '*', # 折線圖中添加圓點
         markersize = 3, # 點的大小
         )
# 修改x軸和y軸标簽
plt.xlabel('疊代次數')
plt.ylabel('誤內插補點')
# 顯示圖形
plt.show()      
疊代第44次後,誤差等于0
所求方程式的根為3.03057732650459      
牛頓法求方程的根(C&amp;Matlab&amp;Python語言實作)

 (4)Python中Sympy庫

      在(3)中有一個Python中很重要的一個庫:sympy。遇到複雜計算找python絕對不讓你失望,​​sympy​​是一個Python的科學計算庫,用一套強大的符号計算體系完成諸如多項式求值、求極限、解方程、求積分、微分方程、級數展開、矩陣運算等等計算問題。雖然Matlab的類似科學計算能力也很強大,但是Python以其文法簡單、易上手、異常豐富的三方庫生态,個人認為可以更優雅地解決日常遇到的各種計算問題。

   SymPy是一個符号計算的Python庫。它的目标是成為一個全功能的計算機代數系統,同時保持代碼簡潔、易于了解和擴充。它完全由Python寫成,不依賴于外部庫。   

      SymPy支援符号計算、​​求導,求偏導​​​,高精度計算、模式比對、繪圖、解方程、微積分、組合數學、離散數學、幾何學、機率與統計、實體學等方面的功能。

4、總結