对于两个耦合的二阶微分方程组,如何实现六个初始条件?

时间:2018-10-24 20:39:18

标签: matlab numerical-methods differential-equations scientific-computing numerical-analysis

我是编码新手。关于我的问题的基本信息是:r1和r2是两个变量; u1 = dr1 / dt,u2 = dr2 / dt,并且du1 / dt = d ^ 2r1 / dt ^ 2,du2 / dt = d ^ 2r2 / dt ^ 2。在Matlab代码中:r(1)暗示r1,r(2)-> u1,r(3)-> r2,r(4)-> u2。 rdot(2)是du1 / dt的表达式,而rdot(4)是du2 / dt的表达式。 理想情况下,我只需要4个初始条件:r1(0),u1(0),r2(0),u2(0),它们分别是10d-6、0、5d-6、0。但是在我的情况下,du1 / dt对du2 / dt有依赖性,反之亦然。参见T1_1和T2_1的最后一项。并且du1 / dt和du2 / dt的理想IC均为0。但是如何在我的代码中实现呢?

我的代码在这里。


function rdot = f(t, r)

P_stat = 1.01325d5;
P_v = 2.3388d3;
mu = 1.002d-3;
sigma = 72.8d-3;
c_s = 1481d0;
poly_exp = 1.4d0;
rho = 998.2071d0;
f_s = 20d3;
P_s = 1.01325d5;
r1_eq = 10d-6;
r2_eq = 4d-6;
d = 1d-3;


rdot(1) = r(2);
P1_bw = ( (P_stat - P_v + (2.d0*sigma/r1_eq))*((r1_eq/r(1))^(3.d0*poly_exp)) ) - (2.d0*sigma/r(1)) - (4.d0*mu*r(2)/r(1));
P1_ext = P_s*sin(2.d0*pi*f_s*(t + (r(1)/c_s)));
T2_1 = ((2.d0*r(3)*(r(4)^2.d0)) + ((r(3)^2.d0)*rdot(4)))/d;
T2_4 = (1.d0 - (r(2)/c_s))*r(1);
T2_5 = 1.5d0*(1.d0 - (r(2)/(3.d0*c_s)))*(r(2)^2.d0);
T2_6 = (1.d0 + (r(2)/c_s))*(P1_bw - P_stat + P_v - P1_ext)/rho;
T2_8 = ( (-3.d0*poly_exp*r(2)*(P_stat - P_v + (2.d0*sigma/r1_eq))*((r1_eq/r(1))^(3.d0*poly_exp)) ) + (2.d0*sigma*r(2)/r(1)) - (4.d0*mu*(- ((r(2)^2.d0)/r(1)))) )/r(1);
T2_9 = 2.d0*pi*f_s*P_s*(cos(2.d0*pi*f_s*(t + (r(1)/c_s))))*(1.d0 + (r(2)/c_s) );
T2_7 = (r(1)/(rho*c_s))*(T2_8 - T2_9);
rdot(2) =  (T2_6 + T2_7 - T2_1 - T2_5)/(T2_4 + (4.d0*mu/(rho*c_s)));


rdot(3) = r(4);
P2_bw = ( (P_stat - P_v + (2.d0*sigma/r1_eq))*((r1_eq/r(3))^(3.d0*poly_exp)) ) - (2.d0*sigma/r(3)) - (4.d0*mu*r(4)/r(3));
P2_ext = P_s*sin(2.d0*pi*f_s*(t + (r(3)/c_s)));
T1_1 = ((2.d0*r(1)*(r(2)^2.d0)) + ((r(1)^2.d0)*rdot(2)))/d;
T1_4 = (1.d0 - (r(4)/c_s))*r(3);
T1_5 = 1.5d0*(1.d0 - (r(4)/(3.d0*c_s)))*(r(4)^2.d0);
T1_6 = (1.d0 + (r(4)/c_s))*(P2_bw - P_stat + P_v - P2_ext)/rho;
T1_8 = ( (-3.d0*poly_exp*r(4)*(P_stat - P_v + (2.d0*sigma/r1_eq))*((r1_eq/r(3))^(3.d0*poly_exp)) ) + (2.d0*sigma*r(4)/r(3)) - (4.d0*mu*(- ((r(4)^2.d0)/r(3)))) )/r(3);
T1_9 = 2.d0*pi*f_s*P_s*(cos(2.d0*pi*f_s*(t + (r(3)/c_s))))*(1.d0 + (r(4)/c_s) );
T1_7 = (r(3)/(rho*c_s))*(T1_8 - T1_9);
rdot(4) =  (T1_6 + T1_7 - T1_1 - T1_5)/(T1_4 + (4.d0*mu/(rho*c_s)));

rdot = rdot';

clc;
clear all;
close all;
time_range = [0 3000d-6];
initial_conditions = [10d-6 0.d0 5d-6 0.d0];
[t, r] = ode45('bubble', time_range, initial_conditions);
plot(t, r(:, 1), t, r(:, 3));

3 个答案:

答案 0 :(得分:0)

对于ODE的每个学位,您将需要一个初始条件。这是由于您要计算的功能量。对于您而言,您拥有一个二阶ODE系统,该系统在求解后将提供总共四个功能:r(1), r(2), r(3), r(4)

为什么我们甚至需要初始条件?假设您有一个简单的导数:y'= y 我们知道函数y = exp(x) * C解决了此问题,但是我们需要调整C才能获得“唯一解决方案”。另一方面,一旦定义了y',就给y一个完全定义的初始条件是没有意义的。 “外部”变量是以导数形式还是线性因子的形式都没关系。它与IC的数量无关。

我希望可以澄清一下。从我的角度来看,您的程序应该可以这样工作,但是我没有机会尝试一下。

答案 1 :(得分:0)

您的情况基本上是

rdot(2) = a2 + b2*rdot(4)
rdot(4) = a4 + b4*rdot(2)

其中a2,b2,a4,b4包含表达式中的所有其他术语。

这是一个线性系统,必须解决才能获得正确的值以返回。您可以使用Matlab的线性求解器,也可以在这种简单的二维情况下手动完成

rdot(2) = a2 + b2*(a4 + b4*rdot(2))  ==>  rdot(2) = (a2 + b2*a4) / (1 - b2*b4)
rdot(4) = a4 + b4*(a2 + b2*rdot(4))  ==>  rdot(2) = (a4 + b4*a2) / (1 - b2*b4)

要应用此功能,您需要拆分

T1_1  as T1_1a + T1_1b*rdot(4), 

您可以根据给定的常量和状态变量来计算T1_1aT1_1b。然后到底在哪里

 rdot(2)=(other + coeff*T1_1)/denom 

您必须拆分为

 a2 =(other + coeff*T1_1a) / denom    and 
 b2 =         coeff*T1_1b  / denom 

,对第二部分执行相同操作以获得a4,b4,然后应用上面的解决方案公式。

答案 2 :(得分:0)

我通过引入两个带有初始条件的新变量解决了这个问题,但是随着代码的运行它们会更新。新代码在这里带有两个变量:r2ddot和r1ddot;

function rdot = f(t, r)

P_stat = 1.01325d5;
P_v = 2.3388d3;
mu = 1.002d-3;
sigma = 72.8d-3;
c_s = 1481d0;
poly_exp = 1.4d0;
rho = 998.2071d0;
f_s = 20d3;
P_s = 1.01325d5;
r1_eq = 4d-6;
r2_eq = 5d-6;
d = 50*(r1_eq + r2_eq);

r2ddot = 0;
r1ddot = 0;

rdot(1) = r(2);
P2_bw = ( (P_stat - P_v + (2.d0*sigma/r2_eq))*((r2_eq/r(3))^(3.d0*poly_exp)) ) - (2.d0*sigma/r(3)) - (4.d0*mu*r(4)/r(3));
P2_ext = P_s*sin(2.d0*pi*f_s*(t + (r(3)/c_s)));
T1_1 = ((2.d0*r(1)*(r(2)^2.d0)) + ((r(1)^2.d0)*r1ddot))/d;
T1_4 = (1.d0 - (r(4)/c_s))*r(3);
T1_5 = 1.5d0*(1.d0 - (r(4)/(3.d0*c_s)))*(r(4)^2.d0);
T1_6 = (1.d0 + (r(4)/c_s))*(P2_bw - P_stat + P_v - P2_ext)/rho;
T1_8 = ( (-3.d0*poly_exp*r(4)*(P_stat - P_v + (2.d0*sigma/r2_eq))*((r2_eq/r(3))^(3.d0*poly_exp)) ) + (2.d0*sigma*r(4)/r(3)) - (4.d0*mu*(- ((r(4)^2.d0)/r(3)))) )/r(3);
T1_9 = 2.d0*pi*f_s*P_s*(cos(2.d0*pi*f_s*(t + (r(3)/c_s))))*(1.d0 + (r(4)/c_s) );
T1_7 = (r(3)/(rho*c_s))*(T1_8 - T1_9);
rdot(2) =  (T1_6 + T1_7 - T1_1 - T1_5)/(T1_4 + (4.d0*mu/(rho*c_s))) ;
r2ddot = rdot(2);

rdot(3) = r(4);
P1_bw = ( (P_stat - P_v + (2.d0*sigma/r1_eq))*((r1_eq/r(1))^(3.d0*poly_exp)) ) - (2.d0*sigma/r(1)) - (4.d0*mu*r(2)/r(1));
P1_ext = P_s*sin(2.d0*pi*f_s*(t + (r(1)/c_s)));
T2_1 = ((2.d0*r(3)*(r(4)^2.d0)) + ((r(3)^2.d0)*r2ddot))/d;
T2_4 = (1.d0 - (r(2)/c_s))*r(1);
T2_5 = 1.5d0*(1.d0 - (r(2)/(3.d0*c_s)))*(r(2)^2.d0);
T2_6 = (1.d0 + (r(2)/c_s))*(P1_bw - P_stat + P_v - P1_ext)/rho;
T2_8 = ( (-3.d0*poly_exp*r(2)*(P_stat - P_v + (2.d0*sigma/r1_eq))*((r1_eq/r(1))^(3.d0*poly_exp)) ) + (2.d0*sigma*r(2)/r(1)) - (4.d0*mu*(- ((r(2)^2.d0)/r(1)))) )/r(1);
T2_9 = 2.d0*pi*f_s*P_s*(cos(2.d0*pi*f_s*(t + (r(1)/c_s))))*(1.d0 + (r(2)/c_s) );
T2_7 = (r(1)/(rho*c_s))*(T2_8 - T2_9);
rdot(4) =  (T2_6 + T2_7 - T2_1 - T2_5)/(T2_4 + (4.d0*mu/(rho*c_s)));
r1ddot = rdot(4);
rdot = rdot';


clc;
clear all;
close all;
time_range = [0 1d-3];
initial_conditions = [4d-6 0.d0 5d-6 0.d0];
[t, r] = ode45('bubble', time_range, initial_conditions);
plot(t, r(:, 1), t, r(:, 3));

但是我无法获得理想的结果。实际上,我正在尝试从附件中复制结果,请参见等式7。enter link description here

enter image description here

第二组方程可以通过互换索引1和2来获得。

重要说明:在Mettin论文的等式7的最后一项中有一个错字,可以通过检查各个术语的大小来验证。正确的期末可以从另一篇论文https://journals.aps.org/pre/abstract/10.1103/PhysRevE.83.066313中看到 请参阅下面的等式(1)中的最后一项。忽略方程式中的其他多余项。重要的一点是,方程式在Rj中为二阶,而方程式最后在Ri中具有二阶项。这就是我尝试编写的代码。 enter image description here

我们将不胜感激任何帮助。