matlab求二元方程组数值解

matlab求二元方程组数值解,第1张

程序:

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求解二阶微分方程数值解,程序出现错误,求大神指点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9653245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存