パラメータが空間と時間に依存する ODE のシステムを解くための高速な matlab コードを作成したいと考えています。ベクトル的に解く方法はありますか? 以下はコードの一部です。
function dM=testfun(T,M,B1)
Mx=M(1);
My=M(2);
Mz=M(3);
dM=[My*B1(3)-Mz*B1(2);Mz*B1(1)-Mx*B1(3);Mx*B1(2)-My*B1(1)]+...
[-Mx/T2;-My/T2;(1-Mz)/T1];
here B1 is space-time dependent variable
メインプログラム:
clc;clear all;
tmin=0;
dt=rand(5,1);
tsteps=10;
B1x=rand(5,1);% time-dependent
jx=length(x);
z=-10:10;
jz=length(z);
M0=repmat([0; 0; 1],1,jz);
for p=1:jz
B1=[B1x;zeros(1,jx);10*z(jz)*ones(1,jx)]; % 3rd term is space dependent
for pp=1:jx
tspan=linspace(tmin,tmin+dt,tsteps);
[t,M(:,:,pp,p)]=ode45 (@(t,M) testfun(t,M,B1(:,jj)),tspan,M0(:,p));
tmin=tmin+dt;
end
end
コードをベクトル化する方法はありますか? 時間依存性には 1 つの問題があります。matlab には、時間依存 ODE を処理するための組み込み関数 interp1 がありますが、時間がかかりすぎます。こちらをチェック 時間依存パラメータを持つ常微分方程式系の解き方 私のコードはこの基本方程式を発展させるので、時間を節約することが重要です。抜け道はありますか?前もって感謝します。
コードのベクトル化は、次の投稿で見つけることができます。 反復ごとに ODE ソルバーを含む Matlab コードのベクトル化
以下の投稿も大変参考になります。 時間依存のパラメーターを持つ常微分方程式系を解く方法