求助---求解非线性方程组 fsolve 函数怎么用?
我有一道关于小系统仿真的题,数学模型的公式我都写出来了,本来想将它进行拉斯变换,再将其传递函数求解出来,用simulink求解,但由于非线性,拉丝变换较困难,我把他作为一个方程组来求解,在不断的变换初始的值,直到满足要求,设置一个时间函数,求出所用的时间(达到要求时所用时间)方程组:
'2010*((p2/p1)^0.07-1)=h2-h1',...
'p1=exp(16.1-2740/(t1+273.15))',...
'p2=exp(16.1-2740/(t2+273.15))',...
'h1=1461.5+1.125*t1-0.0103*t1*t1',...
'h2=1461.5+1.125*t2-0.0103*t2*t2',...
't1=35',...
'V=0.018-0.003*((p2/p1)^1.2-1)',...
'v=0.2854-0.00826*t2+0.0000776*t2*t2',...
'm=V/v',...
'(t2-30)*12*5.6=(h2-(200+4.599*t3+0.004177*t3*t3))*m',...
'(200+4.599*t3+0.004177*t3*t3)*m+(15250-m)*(200+4.599*t1+0.004177*t1*t1)=((200+4.599*t+0.004177*t*t))*15250'
共有11变量,前5个是独立可以单独求解的,后六个也可单独求解(在知道前5个未知数的初始值时)但我不知道怎样才能在solve 或fsolve里进行变量值得传递!
比如将方程组中的t1 值不断用求出的 t 值替代,从而求出当t =10的时候停止计算,在求出时间的常数,每算一次为1秒,累计时间可求出系统平衡时所用时间。
关键是怎样将t1 的值不断的替代的问题,请高手赐教!!!
在此,先谢过了! 看看是不是和你类似的问题
http://forum.vibunion.com/forum/viewthread.php?tid=16128
[ 本帖最后由 eight 于 2007-1-19 19:06 编辑 ] <P>不一样</P> 回帖中有没有将到变量传递的方法? 但我按照他将的方法做,还是不行! ^_^,那你先别急啊,再想想试试。
我也只是个中间人。 呵呵,太感谢了,我正努力中! 变量 传递 看 这个 嘿嘿
你能贴程序出来吗 这样快点 帮你解决问题 HOHO
http://forum.vibunion.com/forum/viewthread.php?tid=15255
[ 本帖最后由 eight 于 2007-1-19 19:08 编辑 ] function c_w(p2,t3,h1,h2,t,m,v,V,p1,t2,t1)
q=[ 2010*((p2/p1)^0.07-1)-(h2-h1);...
p1-exp(16.1-2740/(t1+273.15));...
p2-exp(16.1-2740/(t2+273.15));...
h1-(1461.5+1.125*t1-0.0103*t1*t1);...
h2-(1461.5+1.125*t2-0.0103*t2*t2);...
V-(0.018-0.003*((p2/p1)^1.2-1));...
v-(0.2854-0.00826*t1+0.0000776*t2*t2);...
m-V/v;...
(t2-30)*12*5.6-(h2-(200+4.599*t3+0.004177*t3*t3))*m;...
(200+4.599*t3+0.004177*t3*t3)*m+(15250-m)*(200+4.599*t1+0.004177*t1*t1)-((200+4.599*t+0.004177*t*t))*15250];
option=optimset('display','off');
a=fsolve('c_w',,options,35);这是程序中的调用函数部分,这样写不对,应该怎样改?
我把t1当成常数,其他为未知数,求解.初值 我都写出来了,其中t3物理意义不对,暂且不管,我想把这组方程求解出来,形式该如何改? 看完有点儿感想。
本来不想管这个帖子,参数传递的问题在几个论坛,单单是不成器的我就总共说过不下十次,实在没兴趣重复,但是既然有引用我的帖子的人,我想我就有责任应该说多两句:
首先半开玩笑说一句,关于参数传递的问题是论坛里好几个顶尖高手呕心沥血总结出来的,都在我给的链接里(当然我自己做的不算),MATLAB中参数传递的方法应该一网打尽。其中内容自我拜读至今接近一年,里面很多方法我还没能完全理解吃透和一一尝试,只能一知半解套用解些问题,我看楼主从别人给出链接到回帖断定我给的参数传递的方法和你的问题“不一样”的时间一共两分钟!我只能说,你实在太强了!可是后面看你甚至连fsolve的正确写法都不会,不客气地说,我看你离解决参数传递的问题还差着老远距离,现在解决类似问题已经属于不会走就要飞的情况了。
下面是认真说的话:
用这样草草下结论就断定什么是“行”什么是“不行”的方式去学习,个人感觉非常不合适,建议供你参考,下面是你这个问题的解决办法,两个函数存成两个M文件,运行fangchengqiugen.m
但是提醒一下:你的数学模型应该有点儿问题,求解出现迭代超限的警告信息,换句话说,由于exitflag=0,所以有可能没有搜索到可行解。
function F=c_w(x,t1)
% x=
F=[2010*((x(1)/x(9))^0.07-1)-(x(4)-x(3));...
x(9)-exp(16.1-2740/(t1+273.15));...
x(1)-exp(16.1-2740/(x(10)+273.15));...
x(3)-(1461.5+1.125*t1-0.0103*t1*t1);...
x(4)-(1461.5+1.125*x(10)-0.0103*x(10)*x(10));...
x(8)-(0.018-0.003*((x(1)/x(9))^1.2-1));...
x(7)-(0.2854-0.00826*t1+0.0000776*x(10)*x(10));...
x(6)-x(8)/x(7);...
(x(10)-30)*12*5.6-(x(4)-(200+4.599*x(2)+0.004177*x(2)*x(2)))*x(6);...
(200+4.599*x(2)+0.004177*x(2)*x(2))*x(6)+(15250-x(6))*(200+4.599*t1+0.004177*t1*t1)-((200+4.599*x(5)+0.004177*x(5)*x(5)))*15250];
=======================================================
function fangchengqiugen
clc
x0=;
t1=x0(5);
xx=fsolve('c_w',x0,[],t1);
t1=xx(5);
count=0;
x=[];
while xx(5)>8|count==200
=fsolve('c_w',xx,[],t1)
if exitflag>=0
t1=xx(5);
x=;
else
disp('未搜索到可行解,程序跳出!')
return
end
end
plot(1:length(x),x)
hold on
plot(1:length(x),x,'b*')==============================================
MATLAB首轮计算结果:
xx =
Columns 1 through 2
39.382493295041 18592.7261877628
Columns 3 through 4
1488.00039845052 1500.37608066494
Columns 5 through 6
33.9836283943674 -0.0508299898796435
Columns 7 through 8
0.00282348863506527 0.017996577805948
Columns 9 through 10
1350.00076083419 1328.99038366648
=================================================
1stopt所得首轮计算结果:
"Type your title here"
====== 结果 ======
迭代数: 3134
计算用时(时:分:秒:毫秒): 00:00:25:437
计算中止原因: 达到收敛判定标准
优化算法: 最大继承法
函数表达式 1: 2010*((x1/x9)^0.07-1)-(x4-x3)-(0)
2: x9-exp(16.1-2740/(35+273.15))-(0)
3: x1-exp(16.1-2740/(x10+273.15))-(0)
4: x3-(1461.5+1.125*35-0.0103*35*35)-(0)
5: x4-(1461.5+1.125*x10-0.0103*x10*x10)-(0)
6: x8-(0.018-0.003*((x1/x9)^1.2-1))-(0)
7: x7-(0.2854-0.00826*35+0.0000776*x10*x10)-(0)
8: x6-x8/x7-(0)
9: (x10-30)*12*5.6-(x4-(200+4.599*x2+0.004177*x2*x2))*x6-(0)
10: (200+4.599*x2+0.004177*x2*x2)*x6+(15250-x6)*(200+4.599*35+0.004177*35*35)-((200+4.599*x5+0.004177*x5
*x5))*15250-(0)
目标函数值:
273.711507463666
x1: 0.00010611700664357
x2: 31.208759752968
x3: 1488.25749995189
x4: 117.795709620093
x5: 34.9780323671581
x6: 88.6486187515555
x7: 0.000236889728871927
x8: 0.0209999472611623
x9: 1350.49505693766
x10: -273.148883399559
====== 计算结束 ======
==========================================
可以看出计算结果是有差别的,原因不祥,不过已经超出了本帖的讨论范围。
=================================================
下面是MATLAB 最终的计算结果:
xx =
Columns 1 through 2
39.445843073854 19333.655928724
Columns 3 through 4
1488.00041505455 1500.37581220236
Columns 5 through 6
9.04605541377359 -0.0546256611394763
Columns 7 through 8
0.0032631083705612 0.0179224976025569
Columns 9 through 10
1350.00072217057 1208.06501658615
==============================================
其实即使把迭代终止计算条件设为t=8照样可以,因为t值几乎线性下降。剩下就是你的工作了。言止于此,good luck! 谢谢教诲,也谢谢bainhome.
我是新手,我最近遇到一个作业题,只是想用这种方法来解决,当然,我还在不断的学习中,希望以后大家能继续帮助我,在这门软件的学习上还请大家多给点意见.
衷心的感谢! ding~~ ^_^,bainhome真是强啊。顶 看过了,受益匪浅 引用Bainhome的1stOpt代码,稍加修改,可得一稳定且收敛的结果。
1stOpt代码:
**********************************************
Algorithm = GLM; //2.0的该算法,求解方程能力大幅提高,故选用此算法
Parameter x1, x9;//x1,x9必为同号,在此限定均大于0
Function2010*((x1/x9)^0.07-1)-(x4-x3);
x9-exp(16.1-2740/(35+273.15));
x1-exp(16.1-2740/(x10+273.15));
x3-(1461.5+1.125*35-0.0103*35*35);
x4-(1461.5+1.125*x10-0.0103*x10*x10);
x8-(0.018-0.003*((x1/x9)^1.2-1));
x7-(0.2854-0.00826*35+0.0000776*x10*x10);
x6-x8/x7-(0);
(x10-30)*12*5.6-(x4-(200+4.599*x2+0.004177*x2*x2))*x6;
(200+4.599*x2+0.004177*x2*x2)*x6+(15250-x6)*(200+4.599*35+0.004177*35*35)-((200+4.599*x5+0.004177*x5*x5))*15250;
结果:
目标函数值: 9.12344196606863E-12
x1: 1350.49604821181
x9: 1350.49506018757
x4: 1488.25754075863
x3: 1488.2574689113
x10: 35.0000255202843
x8: 0.0180089559778682
x7: 0.0913583733203168
x6: 0.197125123887604
x2: -99.5012624975721
x5: 34.998461091927
只有”麦考特+全局通用“能几乎每次收敛到同一结果。
页:
[1]
2