Search code examples
matlabdifferential-equations

Solving coupled nonlinear differential equations


I have a differential equation that is as follows:

%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 ;

So I have that my matrix is specifically dependent on t. For some reason, I am having a super difficult time solving this with ode45. My thoughts were to do as follows ( I want to solve for x,y at a time T that was defined):

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

The first error I get is that

Undefined function or variable 'M11'.  

Is there a cleaner way I could be doing this ?


Solution

  • I'm assuming you're running this within a script, which means that your function ddt is a local function instead of a nested function. That means it doesn't have access to your matrix variables m11, etc. Another issue is that you will want to be evaluating your matrix variables at the specific value of t within ddt, which your current code doesn't do.

    Here's an alternative way to set things up that should work for you:

    % 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);