【问题标题】:Solving coupled nonlinear differential equations求解耦合非线性微分方程
【发布时间】:2017-11-10 21:20:31
【问题描述】:

我有一个微分方程如下:

%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 解决这个问题。我的想法如下(我想在定义的时间 T 求解 x,y):

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

我得到的第一个错误是

Undefined function or variable 'M11'.  

有没有更清洁的方法可以做到这一点?

【问题讨论】:

    标签: matlab differential-equations


    【解决方案1】:

    我假设您在脚本中运行它,这意味着您的函数 ddtlocal function 而不是 nested function。这意味着它无法访问您的矩阵变量m11 等。另一个问题是您将希望在ddt 内以t 的特定值评估您的矩阵变量,而您当前的代码没有不会。

    以下是另一种设置方式,适合您:

    % 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】:

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

      mat = @(t) sin(cos(w*t))
      function xprime = ddt(t,x)
          a = mat(t) + 5 ; 
          b = 5;
          ddt = [ a, b; -b, -a]*x
      end
      

      也应该作为内部过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-14
        • 1970-01-01
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        相关资源
        最近更新 更多