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

求解耦合非线性微分方程
EN

Stack Overflow用户
提问于 2017-11-10 21:20:31
回答 2查看 588关注 0票数 1

我有一个微分方程如下:

代码语言:javascript
复制
%d/dt [x;y] = [m11 m12;m11 m12][x;y]
mat = @(t) sin(cos(w*t))
m11 = mat(t) + 5 ; 
m12 = 5;
m21 = -m12 ;
m22 = -m11 ;

因此,我的矩阵特别依赖于t。由于某些原因,我在用ode45解决这个问题时遇到了极大的困难。我的想法是这样做的(我想解决x,y在定义的时间T):

代码语言:javascript
复制
t = linspace(0,T,100) ; % Arbitrary 100
x0 = (1 0); %Init cond
[tf,xf] = ode45(@ddt,t,x0)

function xprime = ddt(t,x)
ddt = [m11*x(1)+m12*x(2) ; m12*x(1)+m12*x(2) ]
end

我得到的第一个错误是

代码语言:javascript
复制
Undefined function or variable 'M11'.  

有没有更干净的方法可以让我这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-11 04:18:36

我假设您是在脚本中运行这个函数,这意味着您的函数ddt是一个局部函数而不是一个嵌套函数。这意味着它无法访问矩阵变量m11等。另一个问题是,您需要在ddt中以t的特定值计算矩阵变量,而当前代码没有这样做。

下面是一种为您设置合适的替代方法:

代码语言:javascript
复制
% Define constants:
w = 1;
T = 10;
t = linspace(0, T, 100);
x0 = [1 0];

% Define anonymous functions:
fcn = @(t) sin(cos(w*t));
M = {@(t) fcn(t)+5, 5; -5 @(t) -fcn(t)-5};
ddt = @(t, x) [M{1, 1}(t)*x(1)+M{2, 1}*x(2); M{1, 2}*x(1)+M{2, 2}(t)*x(2)];

% Solve equations:
[tf, xf] = ode45(ddt, t, x0);
票数 2
EN

Stack Overflow用户

发布于 2019-09-26 04:21:49

一个明显的错误是函数ddt的返回值是xprime,而不是ddt。然后,正如前面的答案所提到的,定义时的mm1应该给出一个错误,因为没有定义t。但是,即使在定义中有一个t值可用,它也不是调用ddt过程所用的相同的t

代码语言:javascript
复制
mat = @(t) sin(cos(w*t))
function xprime = ddt(t,x)
    a = mat(t) + 5 ; 
    b = 5;
    ddt = [ a, b; -b, -a]*x
end

也应该作为内部程序工作。

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

https://stackoverflow.com/questions/47231292

复制
相关文章

相似问题

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