gilbertlam
2011-04-09, 11:43
最近,小弟在用matlab仿真中遇到一个解常微分方程组的问题,我先把方程组给列出来
dAdz=[ b1*Az(4)+(C1*Az(5)+C2*Az(6))
b2*Az(5)+C3*Az(4)
b3*Az(6)+C4*Az(4)
-b1*Az(1)-(C1*Az(2)+C2*Az(3))
-b2*Az(2)-C3*Az(1)
-b3*Az(3)-C4*Az(1) ];
现在的问题是系数b(包括b1,b2,b3)是10的6次方这样一个数量级,而系数C(包括C1,C2,C3,C4)是10的-1次方这样一个数量级。我尝试了用ode45(解决非刚性问题的函数包)和ode15s(解决刚性问题的函数包)来求解该常微分方程组,设置'RelTol'为1e-5,求解范围及步进为0:0.1:1.1,初始条件为[1 0 0 0 0 0],但出现这些问题,求解时间大概需要2个多钟头,而且最后出来的结果是错误的(因为在该方程中最后求解结果在任意z值下abs(Az(1))^2+abs(Az(2))^2+abs(Az(3))^2+abs(Az(4))^2+abs(Az(5))^2+abs(Az(6))^2=1)。
后来我尝试了下,认为地把系数b改成10的3次方这样一个数量级,系数C不变,结果用ode45求解,其他设置一样,求解时间只要1分钟多一些,而且结果是符合平方总和为1,即结果是正确的。
我的问题是:是否有一种方法是可以用来处理这类系数之间数量级相差较大(比如系数b和C之间差6、7个数量级)的常微分方程组,请各位大侠指点指点,小弟在此先谢过了!
dAdz=[ b1*Az(4)+(C1*Az(5)+C2*Az(6))
b2*Az(5)+C3*Az(4)
b3*Az(6)+C4*Az(4)
-b1*Az(1)-(C1*Az(2)+C2*Az(3))
-b2*Az(2)-C3*Az(1)
-b3*Az(3)-C4*Az(1) ];
现在的问题是系数b(包括b1,b2,b3)是10的6次方这样一个数量级,而系数C(包括C1,C2,C3,C4)是10的-1次方这样一个数量级。我尝试了用ode45(解决非刚性问题的函数包)和ode15s(解决刚性问题的函数包)来求解该常微分方程组,设置'RelTol'为1e-5,求解范围及步进为0:0.1:1.1,初始条件为[1 0 0 0 0 0],但出现这些问题,求解时间大概需要2个多钟头,而且最后出来的结果是错误的(因为在该方程中最后求解结果在任意z值下abs(Az(1))^2+abs(Az(2))^2+abs(Az(3))^2+abs(Az(4))^2+abs(Az(5))^2+abs(Az(6))^2=1)。
后来我尝试了下,认为地把系数b改成10的3次方这样一个数量级,系数C不变,结果用ode45求解,其他设置一样,求解时间只要1分钟多一些,而且结果是符合平方总和为1,即结果是正确的。
我的问题是:是否有一种方法是可以用来处理这类系数之间数量级相差较大(比如系数b和C之间差6、7个数量级)的常微分方程组,请各位大侠指点指点,小弟在此先谢过了!