作业帮 > 综合 > 作业

请教高手指点,用Matlab求解二元非线性方程的程序 (这个程序运行错误如何改正?)

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/17 14:57:44
请教高手指点,用Matlab求解二元非线性方程的程序 (这个程序运行错误如何改正?)
%定义方程
function F=myfun(x,R)
A=250;c=20;h=1;d=0.08;r=0.10;Ie=0.12;Ip=0.15;t=1/12;a=200;b=2;w=-0.98;
syms T p;
p=x(1);
T=x(2);
F=[(a+b*c*(1-R)*(1-d*t)+b*t*(1-2*(w+d)*T)*(h+c*Ip*(1-R))/(T*w+d*T)+b*c*d*(1-R)*(T-t))/(2*b)-p;sqrt(A+t*(a-b*p)*(h+c*Ip*(1-R))/(c*d*(w+d)*(1-R)*(a-b*p)))-T];
%求解
A=250;c=20;h=1;d=0.08;r=0.10;Ie=0.12;Ip=0.15;t=1/12;a=200;b=2;w=-0.98;
R=0; TP=0;
syms p T;
x0=[10; 0.1];
R=0:0.05:0.6
for i=1:1:12
RR=R(i);
x=fsolve(@myfun(x,RR),x0,optimset('display','off'));
p(i)=x(1)
T(i)=x(2)
end
请高手指点,谢谢
我将求解部分进行改进一下还是不行呢?
A=250;c=20;h=1;d=0.08;r=0.10;Ie=0.12;Ip=0.15;t=1/12;a=200;b=2;w=-0.98;
R=0; TP=0;
syms p T;
x0=[4; 0.01];
i=0;
for R=0:0.05:0.6
i=i+1;
RR=R(i);
x=fsolve(@(x) myfun(x,RR),x0,optimset('display','off'));
p(i)=x(1)
T(i)=x(2)
end
不知道到你为什么把程序搞这么复杂.直接把各个参数带入方程啊.直接用fsolve.
fsolve用法:
x=fsolve(fun,x0)求解fun(x)=0的解,x0是初值,fun是函数,x就是解
因为fsolve使用迭代法求解方程的,所以总要有个迭代的初值吧,这个初值就是你给的x0.
比如解方程组
x(1).^2+x(2).^2=1
x(1)=2*x(2)
可以写成
f=@(x)([x(1).^2+x(2).^2-1;x(1)-2*x(2)])
x=fsolve(f,[1 1])
这里[1 1]就是初值,其实初值一般情况下可以随便给的.
再问: 非常感谢您的精彩回答~ 原来程序中之所有循环因为里面有一个参数M是不断变化的,用循环表示M的变化,式子中真正所求的变量是p和T。按照您的建议我修改如下: 假定M=0;如下: f=@(x)([(200-p*0.48*M/T+80*(1-0.08*1/12)*(1-0.1*M)+1/3*(1/T/+1.8)/(-0.9)+6.4(1/(6*T)+0.9*T-1/12*(-0.9))/(-0.9))/8-p;……); x=fsolve(f,[0.1,0.1]) 结果:x =0.1000 0.1000 问题是:当x起始终会等于所设定的初始值,篇幅限制 抱歉
再答: 不会啊。(估计你方程写错了。仔细检查啊) 随便举个例子: f=@(x)([x(1).*exp(42*x(2)+x(3))-32461;x(1).*exp(46*x(2)+x(3))-32689;x(1).*exp(51*x(2)+x(3))-35417]);x=fsolve(f,[1 1 1]) 结果: x = 0.0000 1.0000 0.8984