【发布时间】:2018-01-26 07:27:39
【问题描述】:
我有一个包含 5 个 ODE 的系统,其中涉及非线性项。我正在尝试在某些范围内改变 3 个参数,以查看哪些参数会产生我正在寻找的必要行为。
问题是我用 3 个 for 循环编写了代码,并且需要很长时间才能获得输出。
当满足满足 ODE 事件的参数集时,我还将参数值存储在循环中。
这就是我在 matlab 中实现它的方式。
function [m,cVal,x,y]=parameters()
b=5000;
q=0;
r=10^4;
s=0;
n=10^-8;
time=3000;
m=[];
cVal=[];
x=[];
y=[];
val1=0.1:0.01:5;
val2=0.1:0.2:8;
val3=10^-13:10^-14:10^-11;
for i=1:length(val1)
for j=1:length(val2)
for k=1:length(val3)
options = odeset('AbsTol',1e-15,'RelTol',1e-13,'Events',@eventfunction);
[t,y,te,ye]=ode45(@(t,y)systemFunc(t,y,[val1(i),val2(j),val3(k)]),0:time,[b,q,s,r,n],options);
if length(te)==1
m=[m;val1(i)];
cVal=[cVal;val2(j)];
x=[x;val3(k)];
y=[y;ye(1)];
end
end
end
end
我还有其他方法可以加快这个过程吗?
我已经简单地用像这样的格式编写了 ODE 系统
function s=systemFunc(t,y,p)
s= zeros(2,1);
s(1)=f*y(1)*(1-(y(1)/k))-p(1)*y(2)*y(1)/(p(2)*y(2)+y(1));
s(2)=p(3)*y(1)-d*y(2);
end
f,d,k 是常数参数。
这些方程比这里的方程更复杂,因为它是一个由 5 个 ODE 组成的系统,其中有许多非线性项相互作用。
【问题讨论】:
标签: matlab performance for-loop differential-equations