0

我想編寫一個快速的MATLAB代碼,我需要編寫一個for循環,並且每次都需要求解一個常微分方程。是否有任何方法可以對代碼進行矢量化? 以下是部分代碼:在每次迭代中涉及ODE解算器的Matlab代碼矢量化

 tspan=0:0.01:20; 
     dw=rand(p,1); 
     M0=repmat([0 0 1],p,1)'; 
     for p=1:ns 
     [t,M(:,:,p)]=ode45(@(t,M) testfun(t,M,dw(p)),tspan,M0(:,p)); 
     end 

其中

 function dM=testfun(t,M,w1) 
     M_x=M(1); 
     M_y=M(2); 
     M_z=M(3); 
     dM=[w1*M_y;-w1*M_x+w1*M_z-2*w1*M_y;-w1*M_y-(1-M_z)]; 

回答

0

試試這個,讓我知道它是如何工作。在ODE系統的

  • 右側:

    function dM = testfun(t,M,w1) 
    
         dM = zeros(length(M), 1); 
    
         M_x = M(1:3:end, 1); 
         M_y = M(2:3:end, 1); 
         M_z = M(3:3:end, 1); 
    
        dM(1:3:end) =    (w1.*M_y)'; 
        dM(2:3:end) = (-w1.*M_x - 2*w1.*M_y + w1.*M_z)'; 
        dM(3:3:end) =    (-w1.*M_y - (1-M_z))'; 
        end 
    
  • 主程序:

    clear all
    clc

    ns = input('Please tell me how many time you need to integrate the ODE system: ');

    tspan = 0:0.01:20;

    dw = rand(ns,1);

    M0 = repmat([0; 0; 1], 1, ns);

    [t, my_M] = ode45(@(t,my_M) testfun(t,my_M,dw), tspan, M0);

    s = size(my_M);

    for i = 1:ns

    M(:, 1:s(2)/ns, i) = my_M(:, s(2)/ns*(i-1)+1:s(2)/ns*i); 
    

    end

+0

謝謝了很多...對不起來晚了,感謝你...但它會幫助我反正... –

+0

下一個問題是......是有可能解決這個相同的系統,如果w1隨時間步長而變化,無需在ODE函數中插入w1,因爲它非常耗時 –