首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求解耦合的一阶非线性微分方程?

如何求解耦合的一阶非线性微分方程?
EN

Stack Overflow用户
提问于 2018-04-03 04:19:01
回答 1查看 435关注 0票数 0

我有一个由2个方程和已知初始条件组成的问题。这些方程式是:

dx/dt = (-a1*sin(y) + a2 + a3*sin(y-x)) / ((dy/dt)*a4*cos(y-x))

dy/dt = (a1*sin(x) -a5 + a6*x + a7*sin(y-x)) / ((dx/dt)*a8*cos(y-x))

其中a1到a8是变量。

我试图在MATLAB上绘制x与t和y与t的关系图,但我不确定如何用数值或解析的方法来解决这个问题。任何帮助都将不胜感激!!

EN

回答 1

Stack Overflow用户

发布于 2018-04-04 03:30:19

问题的ODE不能写成dy/dt=f(t,y)或M(t,y)dy/dt=f(t,y).这意味着它是一个微分代数方程,必须以以下形式进行数值求解:

y,dy__/dt)=0 f(t,

)

在matlab中,这可以通过命令ode15i来完成。

因此,第一步是以适当的方式编写函数,在这种情况下,一个选项是:

代码语言:javascript
复制
function f = cp_ode(t,y,yp,a)
    f1 = (-a(1)*sin(y(2))+a(2)+a(3)*sin(y(2)-y(1)))/yp(2)*a(4)*cos(y(2)-y(1)) - yp(1);
    f2 = (a(1)*sin(y(1))-a(5)+a(6)*y(1)+a(7)*sin(y(2)-y(1)))/yp(1)*a(8)*cos(y(2)-y(1)) - yp(2);
    f = [f1 ; f2] ; 
end

然后,可以设置初始条件和积分时间跨度,以便调用ode15i

代码语言:javascript
复制
tspan = [0 10];
y0 = [1; 1] ; 
yp0 = fsolve(@(yp)cp_ode(0,y0,yp,a),<yp0_guess>);
a = ones(1,8) ;
[t,y] = ode15i(@(t,y,yp)cp_ode(t,y,yp,a), tspan, y0, yp0);

必须注意,初始条件t,y__,yp应满足方程f(t,y__,yp__)=0。这里使用fsolve来满足这个条件。

匿名函数的用途是使用参数作为输入来定义函数,然后执行在主代码中定义了参数的ODE求解器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49618221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档