ODE45:对结果的怀疑。正确与否?

计算科学 matlab
2021-12-08 22:20:03

我必须解决 我不知道它是否有帮助,但请注意非常大,而时间跨度非常小()。我得到的结果没有 MATLAB 返回任何错误或警告,但这个结果并不能说服我(我预计峰值在左右)。我已经尝试切换到 ode15s,但输出是一样的。我还能做些什么来查看输出是否发生变化,然后确保这个结果是正确的?

{xx¨+32x˙2=1ρ(Pva1t2a2tP0)x(0)=5106x˙(0)=0
a1=2.4881251014tf=70106t=4105

function vdot = no_thermal_effect_98(t,v)
rho = 959.78;
P0 = 101325;
Pvap = 94285.313;
a1 = (P0 - 1800) / (20e-6)^2;    %nondimensional
a2 = 2 * (1800 - P0) / (20e-6);  %nondimensional
%                                       
vdot = zeros(2,1);
vdot(1) = v(2);
vdot(2) = -1.5 * v(2) * v(2) / v(1) + 1 / (v(1) * rho) *...
    (Pvap - P0 - a1 * t^2 - a2 * t);

跑步

x0 = 5e-6; %meters
tf = 70e-6; %seconds
[t,v] = ode45(@no_thermal_effect_98,[0,tf],[x0,0]);
[t,v(:,1)];
plot(t,v(:,1))

在此处输入图像描述

编辑

我们首先考虑气泡外压力恒定的情况:xx¨+32x˙2=1ρ(PvP0)

如果,则气泡破裂(即半径单调减小);相反,如果,则气泡会增长。P0>PvP0<Pv

描述的气泡外的压力变化P(t)=a1t2+a2t+P0

在此处输入图像描述

时,气泡外的压力大于气泡内的压力(在图中,用橙色线表示,等于)。这就是为什么我预计峰值,即泡沫开始崩溃的那一刻,将是40μsPv=94285.313Pa40μs

1个回答

在 Python 中运行了相同的代码

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt


def func(v, t):
rho = 959.78
P0 = 101325
Pvap = 94285.313
a1 = (P0 - 1800) / (20e-6)**2
a2 = 2 * (1800 - P0) / (20e-6) 
v1 = v[1];
v2 = -1.5 * v[1] * v[1] / v[0] + 1 / (v[0] * rho) *\
(Pvap - P0 - a1 * t**2 - a2 * t)
return [v1, v2]


y0 = 5e-6
tf = 70e-6
t = np.linspace(0, tf, 1000)
y = odeint(func, [y0, 0], t)
plt.plot(1e5*t, 1e5*y[:, 0])

我得到了同样的结果

在此处输入图像描述

如果您担心常量的数值,也许您可​​以更改单位无量纲化您的方程。例如,您可以更改时间τ=t/t0, 和t0=20×106. 并使用链式法则对左侧的导数进行更改,以获得类似

yy+32y2=1ρ[(PvP0)(P0P1)τ22(P1P0)τ]

其中我尝试了这个版本并给了我相同的答案。y=x/t0y=dy/dτP1=1800

笔记

  • 在这两种情况下,我都将轴缩放105
  • 使用问题中的一些物理知识对方程进行无量纲化可能会更好。您可以查看参考 1 以获得一些想法。

在此处输入图像描述

参考

  1. Kudryashov、Nikolay A. 和 Dmitry I. Sinelshchikov。“空泡和充气泡的瑞利方程的解析解。” 物理学杂志 A:数学与理论 47.40(2014):405202。