① 如何求解復雜非線性方程
Newton流線法是近兩年提出的一種從Newton場的觀點出發,沿流線的追蹤演算法。與傳統求解非線性方程組的方法類似,Newton流線法基於迭代方向的收斂性進行求解,但普通的求解方法只在根附近有二次收斂性,對初值比較敏感。而Newton流線法建立了與問題維數和函數的具體性質無關的4個判斷參數:減幅指標 ,降速指標 ,最大斜率 ,斜率比 ,這4個參數是可計算量,基於這些可計算的判斷參數,沿Newton流可以自適應地追蹤或者識別奇點,在計算過程中可以跳過奇點,所以降低了演算法對初始值的敏感度;在很大程度上克服了常規方法的局部收斂性,是一種全局收斂的演算法;並且可以自適應實時確定合適的步長,使得計算更精確。
② matlab解帶參數的非線性方程組
由於方程個數3>未知數個數2,且涉及到距離的計算,所以原問題是求解一個超定(非線性)方程組.平方和形式這里採用最小二乘法解決(n個定點與未知點的計算,n>=2):
先建立pfun.m文件:
%給出待求點p(x,y)的初值p0
%n個定點的坐標x0,y0
%中間相鄰兩定點到p的距離差(最後一個點與起點求差)
function[p,norm,res,exit,out]=pfun(p0,x0,y0,det)
%判斷det輸入的正確性
n=length(det);
fori=1:n-1
ifabs(det(i))>sqrt((x0(i)-x0(i+1))^2+(y0(i)-y0(i+1))^2);
error('abs(det)')
end
end
ifabs(det(n))>sqrt((x0(n)-x0(1))^2+(y0(n)-y0(1))^2)
error('abs(det)')
end
%下降演算法採用Levenberg-Marquardt法
%函數調用最大次數為1000
%由用戶定義目標函數的雅可比矩陣
opt1=optimset('LargeScale','off','MaxFunEvals',1000,'Jacobian','on');
%用非線性最小二乘命令求p(x,y),x=p(1),y=p(2)
[p,norm,res,exit,out]=lsqnonlin(@dfun,p0,[],[],opt1,x0,y0,det);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%建立含雅可比矩陣的pfun.m文件
function[f,g]=dfun(p,x0,y0,det)
n=length(det);
fori=1:n-1
f(i)=sqrt((p(1)-x0(i))^2+(p(2)-y0(i))^2)-...
sqrt((p(1)-x0(i+1))^2+(p(2)-y0(i+1))^2)-det(i);
end
f(n)=sqrt((p(1)-x0(n))^2+(p(2)-y0(n))^2)-...
sqrt((p(1)-x0(1))^2+(p(2)-y0(1))^2)-det(n);
%當函數用兩個輸出參數調用時
ifnargout>1
%計算雅可比矩陣
fori=1:n-1
g(i,1)=(p(1)-x0(i))/sqrt((p(1)-x0(i))^2+(p(2)-y0(i))^2)-...
(p(1)-x0(i+1))/sqrt((p(1)-x0(i+1))^2+(p(2)-y0(i+1))^2);
g(i,2)=(p(2)-y0(i))/sqrt((p(1)-x0(i))^2+(p(2)-y0(i))^2)-...
(p(2)-y0(i+1))/sqrt((p(1)-x0(i+1))^2+(p(2)-y0(i+1))^2);
end
g(n,1)=(p(1)-x0(n))/sqrt((p(1)-x0(n))^2+(p(2)-y0(n))^2)-...
(p(1)-x0(1))/sqrt((p(1)-x0(1))^2+(p(2)-y0(1))^2);
g(n,2)=(p(2)-y0(n))/sqrt((p(1)-x0(n))^2+(p(2)-y0(n))^2)-...
(p(2)-y0(1))/sqrt((p(1)-x0(1))^2+(p(2)-y0(1))^2);
end例如各點關系如下:
輸入:
x0=[0.5,0,0];
y0=[2+sqrt(3)/2,2,0];
det=[sqrt(3)-2,2-2*sqrt(2),2*sqrt(2)-sqrt(3)];
p0=[1,1];
[p,norm,res,exit,out]=pfun(p0,x0,y0,det)
輸出:
p=
2.0000 2.0000
③ PSO如何求解非線性方程組求解
PSO搜索需要一個適應度函數,粒子的好壞是根據其適應度來的,一個非線性方程組,比如說,
f1(x,y)=0;
f2(x,y)=0;
你要搜索它的解,需要定義一個適應度函數,你可以定義
|f1|+|f2|或者定義(f1)^2+(f2)^2,這樣再搜索時尋找適應度函數值最小的那個解,最優粒子的適應度會越來越趨進0,當適應度函數值為0時,必有f1(x,y)=0;f2(x,y)=0;因此,就得到了方程組的解。
當然,你也可以根據側重點的不同來定義適應度函數,例如,若希望優先考慮方程1,則可把適應度函數定義為10*|f1|+|f2|或者10*(f1)^2+(f2)^2,這里的10是我隨意定的,實際中可根據需求來定。
另外,適應度函數,也不是一定向上面那麼定義,你要定義為(f1)^4+(f2)^2等等也是可以的,只是最終的側重點不同了,比如說,f1=0.1,f2=0.15,沒有f1=0.3,f2=0.1的適應度好,顯然是不合乎實際的。
再者,你還可以定義適應度函數為1/|f1| + 1/|f2| ,但是這樣定義後,適應度函數值越大,粒子的適應度越好,在搜索的過程中,最優粒子的適應度函數值越來越大,但理論上適應度函數值為無窮大才行,實際搜索永遠都達不到。
該說的我都說明了,以前寫過PSO演算法,這些都是自己的心得,不知道能否幫上你~~
④ 如何用matlab解多元非線性方程組
使用solve函數。
舉個例子,解非線性方程組 x^2+y^3=10 x^3-y^2=1 其中x,y為方程組的未知量 在Matlab的命名窗口中輸入:
syms x y [x y]=solve('x^2+y=10','x^2-y^2=1','x','y') 即可 輸出計算結果為:
x = (37^(1/2)/2 + 21/2)^(1/2) (21/2 - 37^(1/2)/2)^(1/2) -(21/2 - 1/2*37^(1/2))^(1/2) -(1/2*37^(1/2) + 21/2)^(1/2)
y = - 37^(1/2)/2 - 1/2 37^(1/2)/2 - 1/2 37^(1/2)/2 - 1/2 - 37^(1/2)/2 - 1/2
具體solve函數的使用方法,通過輸入help solve來學習。
⑤ Matlab解非線性方程組
對於帶變數的非線性方程組,可以用Matlab的for循環語句和vpasolve函數聯合求解。實現方法:
m=0:0.01:1;
for i=1:length(m)
syms x y z
f1=cos(x)-cos(y)+cos(z)-m(i);
f2=cos(5*x)-cos(5*y)+cos(5*z);
f3=cos(7*x)-cos(7*y)+cos(7*z);
[x1(i),y1(i),z1(i)]=vpasolve(f1,f2,f3);
end
x=double(x1);y=double(y1);z=double(z1);
plot(m,x,m,y,m,z)
⑥ 20個非線性方程20個未知數 MATLAB 求解
對於非線性方程組求解,可以使用fsove函數。其求解方法:
1、自定義非線性方程組函數,即
function y = func(x)
n1=x(1);n2=x(2);n3=x(3);n4=x(4);n5=x(5);......
。。。。。。
end
2、初定x0的初值,如 x0=rand(1,20)
3、[x,h]=fsolve(@func,x0)
這里,x為方程組的解,h為每個等式的值,如h≈0,說明得到的解是正確的。
⑦ 非線性方程組的解法matlab
用matlab求解非線性方程組方法,可以用下列方法來實現:
方法一,使用solve函數求解
x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;
sol = solve(prob)
方法二,使用fsolve函數求解
F = @(x) [2*x(1) - x(2) - exp(-x(1)); -x(1) + 2*x(2) - exp(-x(2))];
x0=[-5;-5];
[x,fval] = fsolve(F,x0)
方法三,使用迭代法求解,如Newton迭代法
m=3;
x0=zeros(m,1);
tol=1e-6;
x=x0-dfun(x0)\fun(x0);
n=1;
while(norm(x-x0>tol)) & n<1000
x0=x;
x=x0-dfun(x0)\fun(x0);
n=n+1;
end
x
這里,fun是原方程組,dfun是導數方程組
⑧ 如何將非線性方程線性化,以便用矩陣求解
比如
x''+omega0^2*sinx=0;
設x1=x, x2=x'
x''=-omega0^2*sinx
x1'=x2 (1)
x2'=-omega0^2*sinx1 (2)
另這個方程組等於0
可以得到x1=0 或者 pi,x2=0;
線性化:兩個方程分別對x1 x2求偏導,把並寫進2×2的矩陣里。
0 1
-omega0^2*cosx1 0
再把兩組解帶進去
可以得到
0 1
+(-)omega0^2 0
這是一種線性化
第二種是把原方程直接線性化
把非線性的項線性化即可
x''+omega0^2*sinx=0;
這里非線性的是sinx
當然你還是要選取在哪裡線性化,比如在x=0的地方線性化
f(x,x',x'')=x''+omega0^2*sinx;
df/dx''=1, 1*deltax''=deltax''
df/dx'=0, 0*deltax'=0
df/dx=omega0^2*cosx=omega0^2, omega0^2*deltax=omega0^2*deltax
另deltax=y
所以y''+omega0^2*y=0;
線性化完成。