"""
貝爾斯托法:與牛頓法有鬆散關係的一種迭代方法,為求多項式的復根
公式:f5(x)=(x+1)(x-6)(x+7)(x-2)(x+3)
目的:求的該方程式的復根
具體方法:
①多項式迭代除去二次因式,x^2-r*x-s,可以得到復根
為什麼除以二次因式可以得到復根:
②求偏導數
③得到r和s以此改進
計算誤差 r和s
誤差均低於給定的終止條件時可以得到根
④結果可能:
1.三階或者以上以r,s為初始值應用
2.商是二次可利用求根公式得到值
3.商為一次多項式 由單根公式得到
補充:牛頓法-高階方程求根存在復根情況
具體方法:
構造復變函式,x是複數
二元實值函式復合定義域以及函式值
對牛頓迭代公式的f(x)和f『(x)除以因式
得最終表示式
"""import sys
sys.setrecursionlimit(10000) #例如這裡設定為一百萬 遞迴深度不夠
#recursionerror: maximum recursion depth exceeded in comparison
#1073741571錯誤是棧溢位,系統預設的棧空間大小是1mb
print('貝爾斯托法求解多項式f(x)=x^5-3.5*x^4+2.75*x^3+2.125*x^2-3.875*x+1.25的根,使用初始估計r=s=-1並迭代滿足條件t=1%')
i = 0
# 迴圈標記量
#陣列儲存函式式得各個係數
a = [1.25,-3.875,2.125,2.75,-3.5,1]#依次存放a0,a1,a2...
b = ['b0', 'b1', 'b2', 'b3', 'b4', 'b5']
c = ['c0','c1','c2','c3','c4','c5']
rs=[-1,-1,'r','s']#上一次的rs和這一次rs
rs_0 = ['%r','%s']#誤差分析
n = 5
#代表多項式的項數
x = ['x0','x1','x2','x3','x4']
n_0=[3,1]
#求bdef
b(r,s):
global i
i = 3
b[5]=round(a[5],5)#bn = an
b[4]=round(a[4]+r*b[5],5)
while i!=-1:
b[i]=round(a[i]+r*b[i+1]+s*b[i+2],5)
i=i-1
#求cdef
c(r,s):
global i
i = 3
c[5]=round(b[5],4)
c[4]=round(b[4]+r*c[5],4)
while i!=-1:
c[i] = round(b[i]+r*c[i+1]+s*c[i+2],5)
i = i-1
#計算當前r,s存入rs
defanalays
(): r = (b[0]*c[3]-b[1]*c[2])/(c[2]*c[2]-c[1]*c[3])+rs[0]
s = (b[0]*c[2]-b[1]*c[1])/(c[3]*c[1]-c[2]*c[2])+rs[1]
rs[2] = round(r, 4)
rs[3] = round(s, 4)
#誤差分析,存入rs_0
deferror
(): rs_0[0]=round((rs[2]-rs[0])/rs[2],5)
rs_0[1]=round((rs[3]-rs[1])/rs[3],5)
rs[0]=rs[2]
rs[1]=rs[3]
w = 0
#題設題解的下標
j = 0
#存放答案的下標
count = 0
#標記迭代次數
defresult
(r,s):
#貝爾斯托法計算結果
global n,w,j,count
count = count+1
b(r, s)
c(r, s)
analays()
error()
if (abs(rs_0[0])<0.01)|(abs(rs_0[1])<0.01): #誤差滿足條件
print('經過',count,'次迭代得')
x[j] = (rs[2]+(rs[2]**2+4*rs[3])**(1/2))/2
# 4 print('x',j,'=',x[j])
j = j + 1
x[j] = (rs[2]-(rs[2]**2+4*rs[3])**(1/2))/2
# 3 print('x',j,'=',x[j])
j =j+1
n = n_0[w] # n代表當前計算多項式項數
w=w+1
if n == 1:
x[4] = round((-rs[2]) / rs[3],0) # 單項式求解
print('x', 4, '=', x[4])
print('多項式的根:',x)
elif (n == 2):
print('二次項求實根:此題目不需計算')
elif (n > 2):#傳入修正的r,s值 商作為因式迭代
count = 0
a[0] =b[2]
a[1] = b[3]
a[2] = b[4]
a[3] = b[5]
a[4] = 0
a[5] = 0
result(rs[2], rs[3])
else:#不滿足近似條件
result(rs[2],rs[3])#用修正的值繼續迭代
result(-1,-1)#呼叫
結果:
貝爾斯托法求解多項式f(x)=x^5-3.5
*x^4+2.75
*x^3+2.125
*x^2-3.875
*x+1.25的根,使用初始估計r=s=-1並迭代滿足條件t=1%
經過 4 次迭代得
x0 = 0.5
x1 = -1.0
經過 5 次迭代得
x2 = (1+0.49939963956735095j)
x3 = (1-0.49939963956735095j)
x4 = 2.0
多項式的根: [0.5, -1.0, (1+0.49939963956735095j), (1-0.49939963956735095j), 2.0]
process finished with exit code 0
因子分析法
一 因子分析法概述 因子分析法的運用首先是要進行相關性的分組,在不同分組中所包含的變數相關性一致,那麼把相關性一致的這一組就稱為其中的乙個公共因子。在實證中實際要研究的就是這一小組中所涵蓋的每乙個變數,公共因子就是多個變數最終的集合,最終都依據關聯性的大小 成綜合因子。既沒有破壞繁雜的資訊,又避免了...
數值分析2 2 追趕法
追趕法比較特殊,比前面的演算法實現起來都要簡單,唯一要注意的是gamma的座標從1開始 程式分別用3個陣列存放三條對角線 如下 對於係數矩陣是三對角矩陣的方程組可以用追趕法 include include include using namespace std const int maxn 1000...
數值分析之龍貝格求積法
花了一晚上的時間把數值分析裡面定積分求解看懂了,累得早上頭疼發燒。唉革命尚未成功啊!利用richardson外推算法,得到如下的求積方法,其只產生四個序列 其結束迭代準則為 並認為有一定數值分析基礎,不難寫出如下程式 include include include include using nam...