非線性方程組的迭代法(數(shù)值計算高手請進(jìn))
我在用matlab求解一組非線性方程組的時候遇到了困難,因為初值選擇不合適,迭代幾乎都不收斂,由于數(shù)據(jù)量較大,沒有辦法對每個初值進(jìn)行調(diào)整,有沒有一種迭代算法可以對初值沒有要求,我目前使用的是幾個教科書上的算法,牛頓法,不動點(diǎn)迭代,弦割法。期待有高手可以指點(diǎn)迷津,先行謝過!
返回小木蟲查看更多
今日熱帖
我在用matlab求解一組非線性方程組的時候遇到了困難,因為初值選擇不合適,迭代幾乎都不收斂,由于數(shù)據(jù)量較大,沒有辦法對每個初值進(jìn)行調(diào)整,有沒有一種迭代算法可以對初值沒有要求,我目前使用的是幾個教科書上的算法,牛頓法,不動點(diǎn)迭代,弦割法。期待有高手可以指點(diǎn)迷津,先行謝過!
返回小木蟲查看更多
京公網(wǎng)安備 11010802022153號
對初值都要有要求
我個人認(rèn)為是你的迭代方法造成的。
因為是電腦計算,不用考慮計算量,可以選用收斂速度小的方法。一般結(jié)果較好。
如果你的變量很多,確實比較難辦。
建議先估算出其中幾個變量的大致范圍。
我有5個變量,五個方程,都是復(fù)變的,其中包括bessel方程,看來我還是得好好研究一下變量的初值了,謝謝您的回復(fù):)
為了方便向大家請教,我把我的程序貼了出來,第一次使用matlab,對著手冊編了一周,有不夠簡潔的地方還望見諒:)
基本問題就是求解kesai afa gama J0afa J1afa J0gama J1gama(分別為afa gama的零階和一階bessel函數(shù))七個變量的非線性方程組;共有5328個數(shù)據(jù)點(diǎn),每個點(diǎn)都需要求解這樣一個方程組,初值只給了kesai的初值,其它變量有顯式的關(guān)系可以通過kesai求解,實際上是利用迭代法求fkesai=0;
j=1,j=2都是收斂的,j=3就不收斂了
% 不動點(diǎn)迭代
%define constant
clear;
E=3000000000;
rou=1200;
K=2500000000;
a=0.015;
ita=1000000;
sampling_rate=10000000;
f=(1:5238)*sampling_rate/5238;
im=i;
%calculate parameters
for j=1:5238
Estar(j)=-im*E*ita*f(j)/(E-im*ita*f(j));
end
for j=1:5238
kesai0(j)=sqrt(rou*f(j)^2/Estar(j));
end
for j=1:5238
miu(j)=3*K*f(j)*ita*im/(9*K*(1+im*f(j)*ita/E)-im*f(j)*ita);
lamda(j)=K-2/3*miu(j);
end
%initial value of variables
for j=1:5238
kesai(j)=kesai0(j);
afa(j)=sqrt(rou*f(j)^2/(lamda(j)+2*miu(j))-kesai(j)^2);
gama(j)=sqrt(rou*f(j)^2/miu(j)-kesai(j)^2);
J0afa(j)=besselj(0,afa(j)*a);
J1afa(j)=besselj(1,afa(j)*a);
J0gama(j)=besselj(0,gama(j)*a);
J1gama(j)=besselj(1,gama(j)*a);
fkesai(j)=2*afa(j)/a*(gama(j)^2+kesai(j)^2)*J1afa(j)*J1gama(j)-(gama(j)^2-kesai(j)^2)*J0afa(j)*J1gama(j)-4*kesai(j)*afa(j)*gama(j)*J1afa(j)*J0gama(j);
j
%iterative
n=1;
while abs(fkesai(j))>0.0001&(n<=10000)
%不動點(diǎn)迭代from fkesai=0
kesai(j)=(2*afa(j)/a*(gama(j)^2+kesai(j)^2)*J1afa(j)*J1gama(j)-(gama(j)^2-kesai(j)^2)*J0afa(j)*J1gama(j))/(4*afa(j)*gama(j)*J1afa(j)*J0gama(j));
afa(j)=sqrt(rou*f(j)^2/(lamda(j)+2*miu(j))-kesai(j)^2);
gama(j)=sqrt(rou*f(j)^2/miu(j)-kesai(j)^2);
J0afa(j)=besselj(0,afa(j));
J1afa(j)=besselj(1,afa(j));
J0gama(j)=besselj(0,gama(j));
J1gama(j)=besselj(1,gama(j));
fkesai(j)=2*afa(j)/a*(gama(j)^2+kesai(j)^2)*J1afa(j)*J1gama(j)-(gama(j)^2-kesai(j)^2)*J0afa(j)*J1gama(j)-4*kesai(j)*afa(j)*gama(j)*J1afa(j)*J0gama(j);
n=n+1;
abs(fkesai)
end
end,
我覺得不管什么計算方法都是需要一個合適的初值的,特別是這么多的方程和變量,另外合適的步長也很重要,可以適當(dāng)調(diào)下步長,步長未必越小越好,因為本來就是數(shù)值計算,迭代速度最快的可以看下數(shù)值計算里面的幾個方法,還有一個牛頓下山法等的。
你說的對,迭代法沒有取步長的問題,有收斂速率快慢的問題,取步長是二分法的
1stOpt不需要初值,很強(qiáng)大方便,可以試試!