非线性方程组求解 matlab
这样一个方程我用下面的matlab怎么解不出来呢?请高手赐教,我将不甚感激!clcclear%调整常量,预估值,收敛残差,最大迭代步即可计算%常量%%%%%%%%%%%%...
这样一个方程我用下面的matlab怎么解不出来呢?请高手赐教,我将不甚感激!
clc
clear
%调整 常量,预估值,收敛残差,最大迭代步 即可计算
%常量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
q=1;V=5;d=4;w=5;mu=0.5;m=2;
%预估值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Anp=1;Bnp=1;Xnp=1;Ynp=1;Tnp=1;Cnp=1;
%收敛性控制%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
con_res=0.005;%设定收敛残差
c_res=1;%计算残差
res=zeros(6,1);%残差矩阵
%迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
it_num=0;%迭代步数
max_it=100;%最大允许迭代步
while(c_res>con_res)
%赋上步计算值
An=Anp;Bn=Bnp;Xn=Xnp;Yn=Ynp;Tn=Tnp;Cn=Cnp;
%计算
Anp=q*V/(d*m)-(q/mu)*Xn/m-2*(Xn^2+Yn^2)^(1/2)*w*sin(Cn);
Bnp=2*(Xn^2+Yn^2)^(1/2)*w*cos(Cn)-(q/mu)*Yn/m;
Xnp=mu*V/d-An*Tn;
Ynp=2*(Xn^2+Yn^2)^(1/2)*w*cos(Cn)*m*Tn*mu/(q*Tn+m*mu);
Tnp=((mu*V/d)-((mu*V/d)^2-2*An*d)^(1/2))/An;
Cnp=atan(Yn/Xn);
%计算残差
res(1,1)=abs((Anp-An)/An);
res(2,1)=abs((Bnp-Bn)/Bn);
res(3,1)=abs((Xnp-Xn)/Xn);
res(4,1)=abs((Ynp-Yn)/Yn);
res(5,1)=abs((Tnp-Tn)/Tn);
res(6,1)=abs((Cnp-Cn)/Cn);
c_res=max(res);%最大残差
it_num=it_num+1;%
if(it_num>=max_it)
break;
end
end 展开
clc
clear
%调整 常量,预估值,收敛残差,最大迭代步 即可计算
%常量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
q=1;V=5;d=4;w=5;mu=0.5;m=2;
%预估值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Anp=1;Bnp=1;Xnp=1;Ynp=1;Tnp=1;Cnp=1;
%收敛性控制%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
con_res=0.005;%设定收敛残差
c_res=1;%计算残差
res=zeros(6,1);%残差矩阵
%迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
it_num=0;%迭代步数
max_it=100;%最大允许迭代步
while(c_res>con_res)
%赋上步计算值
An=Anp;Bn=Bnp;Xn=Xnp;Yn=Ynp;Tn=Tnp;Cn=Cnp;
%计算
Anp=q*V/(d*m)-(q/mu)*Xn/m-2*(Xn^2+Yn^2)^(1/2)*w*sin(Cn);
Bnp=2*(Xn^2+Yn^2)^(1/2)*w*cos(Cn)-(q/mu)*Yn/m;
Xnp=mu*V/d-An*Tn;
Ynp=2*(Xn^2+Yn^2)^(1/2)*w*cos(Cn)*m*Tn*mu/(q*Tn+m*mu);
Tnp=((mu*V/d)-((mu*V/d)^2-2*An*d)^(1/2))/An;
Cnp=atan(Yn/Xn);
%计算残差
res(1,1)=abs((Anp-An)/An);
res(2,1)=abs((Bnp-Bn)/Bn);
res(3,1)=abs((Xnp-Xn)/Xn);
res(4,1)=abs((Ynp-Yn)/Yn);
res(5,1)=abs((Tnp-Tn)/Tn);
res(6,1)=abs((Cnp-Cn)/Cn);
c_res=max(res);%最大残差
it_num=it_num+1;%
if(it_num>=max_it)
break;
end
end 展开
展开全部
1. 同意“市北吧专用ID”的看法。我没算,但是按照他的化简来说,这个方程最后确实可以化简得很漂亮,没必要弄成非线性方程组问题,而最后可以化成一个简单的非线性方程问题。
2. 你的程序我大致看了一下。大致思路应该也没错。有一个问题,你的这种迭代对于非线性方程问题来说,首先效率太低,其次,我不确定这种迭代最后能不能收敛。这种迭代应该是属于经典迭代的范畴吧,收敛不良好。所以最后你没算出结果,可能的原因就是算法不好,再加上初值选得不好,结果不收敛。
3. 非线性方程有些更佳优良的解法。性能最差的解法是Newton的高维切线迭代法。当然,所有非线性方程问题都不能保证迭代收敛,但是Newton的高维切线法如果收敛,那么收敛性会比你的算法更优。较优的改良方法有两类,一个是拟Newton法,主要是降低计算量,但是收敛性没有显著改善;另一个是Newton下降法,收敛性有显著改善。你应该学过数值分析了吧,这些你翻一下书都能找到算法。
2. 你的程序我大致看了一下。大致思路应该也没错。有一个问题,你的这种迭代对于非线性方程问题来说,首先效率太低,其次,我不确定这种迭代最后能不能收敛。这种迭代应该是属于经典迭代的范畴吧,收敛不良好。所以最后你没算出结果,可能的原因就是算法不好,再加上初值选得不好,结果不收敛。
3. 非线性方程有些更佳优良的解法。性能最差的解法是Newton的高维切线迭代法。当然,所有非线性方程问题都不能保证迭代收敛,但是Newton的高维切线法如果收敛,那么收敛性会比你的算法更优。较优的改良方法有两类,一个是拟Newton法,主要是降低计算量,但是收敛性没有显著改善;另一个是Newton下降法,收敛性有显著改善。你应该学过数值分析了吧,这些你翻一下书都能找到算法。
展开全部
Matlab没用过。只用过mathematics。
但一般来讲不管什么软件,你总要先证实这个迭代过程确实是收敛的才可以这么做吧?
另外实际上这个方程组很简单,我按照程序里的常量化简了一下:
A=1.25*t-8/t^2
B=(80-6.25*t)/(t*(t+1))
X=8/t-0.625
Y=(80-6.25*t)/(t+1)
255*t^3-3232*t^2-5*t+32=0
只要解最后关于t的方程,其他都可以算出来
估算了一下,t有两个大于零的值,一个约等于3232/255;另一个很小,大约在0.099-0.1之间
但一般来讲不管什么软件,你总要先证实这个迭代过程确实是收敛的才可以这么做吧?
另外实际上这个方程组很简单,我按照程序里的常量化简了一下:
A=1.25*t-8/t^2
B=(80-6.25*t)/(t*(t+1))
X=8/t-0.625
Y=(80-6.25*t)/(t+1)
255*t^3-3232*t^2-5*t+32=0
只要解最后关于t的方程,其他都可以算出来
估算了一下,t有两个大于零的值,一个约等于3232/255;另一个很小,大约在0.099-0.1之间
追问
谢谢你的热心回答,不甚感激,但是我现在是那些非变量是符号而不是具体的数值,你能算出来吗?虽然说那些最后都是确定的值,但是我想用符号代替他们,求出A、B、X、Y、T、C关于那些常量的表达式,谢谢高手了。本人是新手,分数不高,望请原谅,好人一生平安。
追答
没事,我也新手
要用符号的话你试下下面这个方程组:
A=q*V/(d*m)-q*x/(mu*m)-2*w*y
x=mu*V/d-A*t
y=2*w*mu*m*x*t/(q*t+mu*m)
d=mu*V*t/d-0.5*A*t^2
就这四个可以了,A,x,y,t是未知量,然后B=2*w*x-q*y/(mu*m)以及C=atan(y/x)并不参与运算的,可以直接代入上述方程的计算结果
但是我并不保证用你原来的方法可以解出,原因参见daliwa7的回答;有可能你需要重写一下方程的表示形式以保证每个未知量的残差都是收敛的。
另外matlab做符号运算不要加载插件吗?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询