程序:
clear
[x y]=solve('A1=x(y-B1)','A2=x(y-B2)','x','y')
x =
-(A1 - A2)/(B1 - B2)
y =
(A1B2 - A2B1)/(A1 - A2)
clear的话是把之前的内存变量删除。目的是防止出错。
这里用的是solve函数。如果是一元一次方程,没有其他符号则直接可以solve('eq')。eq是等式。如果等号右边是0的话‘=0’可以省略。solve('eq','val')的话是解以val为变量,其他视为常量的等式。解方程组的话是solve(eq1,eq2,,eqn,val1,val2,valn)
注意本例中solve返回两个值。一个是x一个是y。所以前面写‘[x y]=’是方便结果的输出。如果不加‘[x,y]=’返回的结果是ans =
x: [1x1 sym]
y: [1x1 sym]
这个时候你可以通过x=ansx,y=ansy得到最后的结果。
如果要学习语句的话,我建议多看看matlab的帮助。虽然是英语的,但是介绍的非常详细。
%欧拉法解一阶常微分方程
% y'=xy^(1/3)
f = inline('xy^(1/3)','x','y');
figure; hold on;
for h = [01 005 001] %三个步长
xleft = 1; %区域的左边界
xright = 5; %区域的右边界
xx = xleft:h:xright; %一系列离散的点
n = length(xx); %点的个数
y0 = 1;
Euler = y0;
for i = 2:n
Euler(i)=Euler(i-1)+hf(xx(i-1),Euler(i-1));
end
plot(xx,Euler,'LineWidth',2);
end
%精确解
y = ((xx^2+2)/3)^(3/2);
plot(xx,y,'r','LineWidth',2);
grid on;
1、把
G=1/3((5Pp-2P1)/(P1-2Pp)-P1c1^2/Ppcp^2);改成
G=1/3((5Pp-2P1)/(P1+2Pp)-P1c1^2/(Ppcp^2));表达式的错误导致出现高频振荡,积分步长非常小(大约在10^-8量级),所以很长时间算不出。
2、从结果看,仿真时间取50秒就足够了(已进入稳态)。
3、在出现busy的情况下,可以考虑让 ode 函数不返回参数,此种情况下,会自动绘制响应曲线,而且可以随时通过GUI停止运行,便于观察求解过程的具体情况。
用Matlab编程计算二阶常微分方程组的数值解的方法有很多种,最常用有ode45函数。
ode45函数的使用格式:
t,y=ode45(odefun,tspan,y0)
例如:
>> odefun=@(t,y)[y(1)+2y(2);3y(1)+2y(2)]; %自定义函数
>> tspan=[0 20]; %时间
>> y0=[1 1]; %初值
>> [t,y]= ode45(odefun,tspan,y0);
>> A=[t,y];
>> A
运行结果
错误其实应该自己检查的,matlab不是提示你哪错了嘛,还不改……function hhhclear;clc;[TOUT,X] = ode45(@odefun,[0,001],[1 0 0 0 0 0 0 0 0]) %t=TOUT,vx=X(:,1),vy=X(:,2),vz=X(:,3)plotyy(TOUT,X(:,1:2),TOUT,X(:,3))function yhat=odefun(t,x)f1=x(1);f2=x(2);f3=x(3);f4=x(4);f4=x(4);f5=x(5);f6=x(6);f7=x(7);f8=x(8);f9=x(9);k=1;r=1;o=5000;g=100;df1=i(-2ikf1+gf4+gf7);df2=i(-2ikf2+gf5);df3=i(-2ikf3+gf6);df4=i(gf1-irf4-2ikf4+of8);df5=i(gf2-irf5-2ikf5+of9);df6=i(gf3-irf6-2ikf6+of8);df7=i(gf1-irf7-2ikf7+of9);df8=i(-2ikf8+of4+of6);df9=i(-2ikf9+of5+of7);yhat=[df1;df2;df3;df4;df5;df6;df7;df8;df9];
在Matlab下输入:edit zhidao_feiyingm,然后将下面两行百分号之间的内容,复制进去,保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=zhidao_feiying(t,x)
a=1;
b=2;
c=3;
d=4;
%%比方说
%f=ax+y-z;
%g=bsin(xy)-ccos(z);
%h=dy-ax;
%%注意x用x(1)代,y用x(2)代,z用x(3)代
f=ax(1)+x(2)-x(3);
g=bsin(x(1)x(2))-ccos(x(3));
h=dx(2)-ax(1);
y=[f;g;h];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在Matlab下面输入:
t_end=5;
x0=[1;1;1];
[t,x]=ode45('zhidao_feiying',[0,t_end],x0);
plot(t,x)
legend('x','y','z')
上面只是固定d的情况,
你如果想做出随d的变化,估计比较麻烦一些,一方面ode45并不是等不长的。
另一方面,参数不好弄。
以上就是关于matlab求二元方程组数值解全部的内容,包括:matlab求二元方程组数值解、matlab编程问题利用欧拉方法求常微分方程近似数值解、用matlab求解二阶微分方程数值解,程序出现错误,求大神指点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)