數值分析 劈因子法(貝爾斯托法)python3實現

2021-08-09 01:38:47 字數 3413 閱讀 8448

"""

貝爾斯托法:與牛頓法有鬆散關係的一種迭代方法,為求多項式的復根

公式: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...