l********1 发帖数: 13 | 1 在matlab中对一个动态系统进行模拟,程序为涉及119个变量的ODEs。
当我利用MATLAB ode45进行求解时,在不长的求解(时间)区间内,花费了10分钟的时
间。
由于我将要利用该程序进行Monte Carlo Simulation,就是说我将要利用ode45对此涉
及119个变量的常微分方程组进行多达数千次的模拟,很显然将会花费大量的时间。
因此,我希望知道:
(1) 是否有更为快速求解ode方程组的matlab程序?
(2) 或者如何能提高ode45对多变量ode方程组的求解速度呢? |
|
x**h 发帖数: 173 | 2 By default, ode45 uses adaptive time steps. Is there any way to force ode45
(or any other ode solver in matlab) to use a fixed integration step? Thanks
in advance. |
|
N******p 发帖数: 2777 | 3 不知道怎么弄。要我的话就建一个Simulink model用 fixed-step solver解。这当然是
傻办法,汗。看看其他大侠怎么说。
不过话又说回来了,fixed-step solver自己写一个也用不了多一会吧。
ode45
Thanks |
|
s*********i 发帖数: 107 | 4 有以下PDE
a1' = cos(a1+a2) + cos(a1) - sin(a1+a2) - sin(a1)
a2' = sin(a1) + cos(a1+a2) - sin(a1+a2)
在matlab中 用ode45数值求解a1,a2,为啥得到的却是在初值那条线上的一系列点,也就
是说a1,a2在所有时间上的值都是初值。(初始条件为 a1(0)=0, a2(0)=0 )
请问,对以上的PDE,要得到a1,a2随时间的大致曲线,在matlab中该怎么弄? |
|
l********1 发帖数: 13 | 5 在matlab中求解一个常微分方程组(ODEs),使用ode45时,求解速度非常的慢。
MATLAB帮助中提示如果ode45的求解速度非常慢,说明该微分方程组是stiff的,可以尝
试ode15s。
我的问题是:是什么造成了方程组出现stiff的情况? 如何避免方程组出现stiff的情
况?
请高手指点,不胜感激! |
|
b******i 发帖数: 914 | 6 Hi,
我试了一下MATLAB,数值解用ode23, ode45等函数,挺快的
谢谢哈 |
|
w***d 发帖数: 17 | 7 thanks for your suggestion. I am doing it right now under windows, P4 3.0G 1G
memory, do you think it is
enough?
Right now in the program most time is spent in solve an ode equation with this
6k variables and I am using the simple matlab built-in solver ode45. I am a
little skeptical about its efficiency. |
|
j**u 发帖数: 6059 | 8 help ode23, ode45, ode113, ode15s, ode23s, ode23t, ode23tb .... |
|
h*******a 发帖数: 41 | 9 比如用matlab的ode45
或maple的 dsolve
只想加边条件 y(0)=y(1),Dy(0)=Dy(1)
好像不work,大虾请指教! |
|
j**u 发帖数: 6059 | 10 公式很简单
dM1/dt = -qM1-c1M1+p1c2M2
dM2/dt = -qM2-c2M2+c1M1+c3M3
dM3/dt = -qM3-c3M3+p2c2M2
initial condition: c1M1+c2M2=c3M3, p1+p2=1
S(q)=M1+M2+M3
现在已有数据系列数据S(q),请问如何做data fitting 得到参数c1,c2,c3和p1,p2? 本
来打算用lsqcurvfit和ode45,但是总是搞不定,大家有什么好办法吗? |
|
|
x**h 发帖数: 173 | 12 Thanks,Newercop. I just wrote one. Didn't want to "waste time." :) |
|
L*******i 发帖数: 51 | 13 a=7.474615e13
by casual,manual search with the following code.
define
function yp=func(a,x,y)
%
yp = (a + sqrt(a^2+3.6e22*y.^3))/2.8e6;
then
>> [t1,y1]=ode45(@(x,y)func(7.474615e13,x,y),[0,1e-8],100); y1(end)-101
you may want to search around for higher precision. |
|
c********i 发帖数: 55 | 14 好冷清……
大概一想,估计个a的初始值,从 ydot = ( y(x1) - y(x0) ) / ( x1 - x0 ),
x1 = exp(-8), x0 = 0
我不知道MATLAB的ODE45到底怎么用,不过楼主可以自己整一个RK4的程序(比较简单)
,然后自己从0积分到1,比较积分误差,给a一个纠正值,再从头积,…… 到满意为止
当然,要是能对a有一个估计最好 要不然可能是超级的慢喽 |
|
e******g 发帖数: 33 | 15 我是外行啊,实在不会,哭死了,拜托大家救我。
有这样一个程序
function [t,S,I,R] = Program_2_1(beta,gamma,S0,I0,MaxTime)
if nargin == 0
beta=1.4247;
gamma=0.14286;
S0=1-1e-6;
I0=1e-6;
MaxTime=70;
end
S=S0; I=I0; R=1-S-I;
% The main iteration
[t, pop]=ode45(@Diff_2_1,[0 MaxTime],[S I R],[],[beta gamma]);
S=pop(:,1); I=pop(:,2); R=pop(:,3);
% Calculates the differential rates used in the integration.
function dPop=Diff_2_1(t,pop, parameter)
beta=parameter(1); gamma=parameter(2);
S=pop(1); I=pop(2); R=pop(3); |
|
|
j**u 发帖数: 6059 | 17 【 以下文字转载自 Computation 讨论区 】
发信人: jzxu (自然), 信区: Computation
标 题: 问个多参数fitting的问题
发信站: BBS 未名空间站 (Wed May 14 22:17:06 2008), 转信
公式很简单
dM1/dt = -qM1-c1M1+p1c2M2
dM2/dt = -qM2-c2M2+c1M1+c3M3
dM3/dt = -qM3-c3M3+p2c2M2
initial condition: c1M1+c2M2=c3M3, p1+p2=1
S(q)=M1+M2+M3
现在已有数据系列数据S(q),请问如何做data fitting 得到参数c1,c2,c3和p1,p2? 本
来打算用lsqcurvfit和ode45,但是总是搞不定,大家有什么好办法吗? |
|
f******e 发帖数: 921 | 18 I want to solve a system of ODE, for example,
x1'=x2-x1^2+x3^2
x2'=-x1*x3-2*x1*x2+x3
for x3, it satisfy, x1^2 + x2^2+x3^2=10;
my code is below:
function xp = F(t,x)
xp = zeros(3,1);
xp(1)= x(2) -x(1)^2+ x(3)^3;
xp(2) = - x(1)*x(3) - 2*x(1)*x(2) + x(3);
x(3) = sqrt(10-x(1)^2-x(2)^2);
[t,x]=ode45(@F,[0,10],[0;1;1]);
plot(t,x)
my figure shows x3 is a straight line, what is the mistake?
How to correct the mistake in my code? thank you very much!!! |
|
m***n 发帖数: 581 | 19 你实际上只有x(1),x(2)两个状态变量。xp(3)始终是0,所以不会更新。最后算的x(3)
是不会传递到x中去的。
我把你的程序改成两个状态变量,x3作为输出变量了:
主程序:
[t,x]=ode45(@F,[0,10],[0;1]);
x3 = sqrt(10-x(:,1).^2-x(:,2).^2);
plot(t,[x x3])
子程序:
function xp = F(t,x)
xp = zeros(2,1);
tmp = sqrt(10-x(1)^2-x(2)^2);
xp(1)= x(2) -x(1)^2+ tmp^3;
xp(2) = - x(1)*tmp - 2*x(1)*x(2) + tmp; |
|
c*******e 发帖数: 8624 | 20 ode45 solves for the values at the nodes
you can use linear interpolation if you wish
in general, if the solution is sufficiently nice
the error should go to 0 as you increase the
number of nodes |
|
t**********r 发帖数: 256 | 21 不过matlab的ODE45之类的东西,
给出来的插值函数是默认线性插值的吧?
mathematica好像也是。
很多时候,我不仅需要某点的值,我需要所有点的值。
例如求解了ODE之后,需要画图plot(x(t),t)
或者求x(t)^2的积分阿。 |
|
c*******e 发帖数: 8624 | 22 ode45 solves for the values at the nodes
you can use linear interpolation if you wish
in general, if the solution is sufficiently nice
the error should go to 0 as you increase the
number of nodes |
|
i***y 发帖数: 3 | 23 如果用lny=x, 则问题化为二阶非线性方程求解,你可以考虑利用matlab中ODEfile来解
。ode45s可能可以解开。但是首先建议你自己看能否猜出一个特解,然后构造解。 |
|
f*******y 发帖数: 139 | 24 一阶常微分方程组可以用ode45等解,但需要输入方程组的定义 dy(1) = y(1)+y(2)
如果有上百个变量,这样输入未免太麻烦了
有没有比较好的办法,只用矩阵就可以定义的(等式右边没有变量的高阶项 如y(1)^2)
这种方程组也可以直接手动数值解,就是怕影响速度。 |
|
s*********n 发帖数: 18 | 25 谢谢muying (心情娃娃∞放飞自由)。
试过MATLAB的ODE SOLVER:ODE45,ODE15S,不行。
进行 |
|
s******n 发帖数: 201 | 26 是一阶微分的话?解出xm,代入m元微分方程组,ode23 和ode45求解。多元的不太清楚。 |
|
j**u 发帖数: 6059 | 27 【 以下文字转载自 EE 讨论区 】
发信人: jzxu (自然), 信区: EE
标 题: 问个多参数fitting的问题
发信站: BBS 未名空间站 (Wed May 14 22:18:54 2008), 站内
发信人: jzxu (自然), 信区: Computation
标 题: 问个多参数fitting的问题
发信站: BBS 未名空间站 (Wed May 14 22:17:06 2008), 转信
公式很简单
dM1/dt = -qM1-c1M1+p1c2M2
dM2/dt = -qM2-c2M2+c1M1+c3M3
dM3/dt = -qM3-c3M3+p2c2M2
initial condition: c1M1+c2M2=c3M3, p1+p2=1
S(q)=M1+M2+M3
现在已有数据系列数据S(q),请问如何做data fitting 得到参数c1,c2,c3和p1,p2? 本
来打算用lsqcurvfit和ode45,但是总是搞不定,大家有什么好办法吗? |
|
z****l 发帖数: 72 | 28 H函数不是挺好的。
数值的话,不就是常微取初值,matlab ode45 |
|
j*p 发帖数: 115 | 29 Don't know why but if you don't use vector, then it works.
function y=numcal(k,x)
x=0:0.1:1;
k1 =1; k2=2; k3=3; k4=4;
y0 = [1 1];
tspan=[0 max(x)];
[tt yy] = ode45(@dydt,tspan,y0,[],k1,k2,k3,k4);
yc=spline(tt',yy',x);
y=yc;
function dy=dydt(t,y,k1,k2,k3,k4)
dy=zeros(2,1);
dy(1)=0.0321*k1*(k2-y(1))-k3*y(1)-y(2);
dy(2)=0.25*k4*exp(-k4*t)*k2; |
|
h******a 发帖数: 198 | 30 matlab could do such job.
see ode45, ode23.
if stiff problem, use ode15s.
not difficult at all. |
|
e******g 发帖数: 33 | 31 我是外行啊,实在不会,哭死了,拜托大家救我。
有这样一个程序
function [t,S,I,R] = Program_2_1(beta,gamma,S0,I0,MaxTime)
if nargin == 0
beta=1.4247;
gamma=0.14286;
S0=1-1e-6;
I0=1e-6;
MaxTime=70;
end
S=S0; I=I0; R=1-S-I;
% The main iteration
[t, pop]=ode45(@Diff_2_1,[0 MaxTime],[S I R],[],[beta gamma]);
S=pop(:,1); I=pop(:,2); R=pop(:,3);
% Calculates the differential rates used in the integration.
function dPop=Diff_2_1(t,pop, parameter)
beta=parameter(1); gamma=parameter(2);
S=pop(1); I=pop(2); R=pop(3); |
|