在 python 中解决边界值问题 DE
Solving a boundary value problem DE in python
我正在尝试解决以下一组 DE:
dx' = cos(a)
dy' = sin(a)
dF' = - b * x * cos(a) + sin(a)
da' = (b * x * sin(a) + cos(a)) / F
满足条件:
x(0) = y(0) = x(1) = 0
y(1) = 0.6
F(0) = 0.38
a(0) = -0.5
我尝试关注 ,但我就是无法正常工作。有没有可能,我的F(0)和a(0)完全关闭了,我什至不确定。
import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt
beta = 5
def fun(x, y):
x, dx, y, dy, F, dF, a, da, = y;
dxds=np.cos(a)
dyds=np.sin(a)
dFds=-beta * x * np.cos(a) + np.sin(a)
dads=(beta * x * np.sin(a) + np.cos(a) ) / F
return dx, dxds, dy, dyds, dF, dFds, da, dads
def bc(ya, yb):
return ya[0], yb[0], ya[2], yb[2] + 0.6, ya[4] + 1, yb[4] + 1, ya[6], yb[6]
x = np.linspace(0, 0.5, 10)
y = np.zeros((8, x.size))
y[4] = 0.38
y[6] = 2.5
res = solve_bvp(fun, bc, x, y)
print(res.message)
x_plot = np.linspace(0, 0.5, 200)
plt.plot(x_plot, res.sol(x_plot)[0])
我认为你最重要的是物理问题,将物理情况转化为 ODE 系统。
x(s)
和 y(s)
是绳索的坐标,其中 s
是沿绳索的长度。因此,(x'(s),y'(s))
是一个单位向量,其角度 a(s)
具有唯一特征,给出
x'(s) = cos(a(s))
y'(s) = sin(a(s))
要获得形状,现在必须考虑力学。假设似乎是绳索在旋转时没有绕旋转轴盘旋,而是停留在一个平面内。此外,从力的平衡你还可以得到其他两个方程确实是一阶方程,而不是二阶方程。所以你的状态只有 4 个组件,因此 ODE 系统函数必须是
def fun(s, u):
x, y, F, a = u;
dxds=np.cos(a)
dyds=np.sin(a)
dFds=-beta * x * np.cos(a) + np.sin(a)
dads=(beta * x * np.sin(a) + np.cos(a) ) / F
return dxds, dyds, dFds, dads
现在只有4个边界条件槽可用,分别是绳子的起点坐标和终点坐标。
def bc(ua, ub):
return ua[0], ub[0], ua[1], ub[1] - 0.6
另外,s
的间隔长度也是绳子的长度,所以0.5的值对于给定的杆子坐标是不可能的,试试1.0。需要进行一些实验才能获得不会导致 BVP 求解器中出现奇异雅可比行列式的初始猜测。最后我在 x-y 平面上得到了解决方案
与组件
我正在尝试解决以下一组 DE:
dx' = cos(a)
dy' = sin(a)
dF' = - b * x * cos(a) + sin(a)
da' = (b * x * sin(a) + cos(a)) / F
满足条件:
x(0) = y(0) = x(1) = 0
y(1) = 0.6
F(0) = 0.38
a(0) = -0.5
我尝试关注
import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt
beta = 5
def fun(x, y):
x, dx, y, dy, F, dF, a, da, = y;
dxds=np.cos(a)
dyds=np.sin(a)
dFds=-beta * x * np.cos(a) + np.sin(a)
dads=(beta * x * np.sin(a) + np.cos(a) ) / F
return dx, dxds, dy, dyds, dF, dFds, da, dads
def bc(ya, yb):
return ya[0], yb[0], ya[2], yb[2] + 0.6, ya[4] + 1, yb[4] + 1, ya[6], yb[6]
x = np.linspace(0, 0.5, 10)
y = np.zeros((8, x.size))
y[4] = 0.38
y[6] = 2.5
res = solve_bvp(fun, bc, x, y)
print(res.message)
x_plot = np.linspace(0, 0.5, 200)
plt.plot(x_plot, res.sol(x_plot)[0])
我认为你最重要的是物理问题,将物理情况转化为 ODE 系统。
x(s)
和 y(s)
是绳索的坐标,其中 s
是沿绳索的长度。因此,(x'(s),y'(s))
是一个单位向量,其角度 a(s)
具有唯一特征,给出
x'(s) = cos(a(s))
y'(s) = sin(a(s))
要获得形状,现在必须考虑力学。假设似乎是绳索在旋转时没有绕旋转轴盘旋,而是停留在一个平面内。此外,从力的平衡你还可以得到其他两个方程确实是一阶方程,而不是二阶方程。所以你的状态只有 4 个组件,因此 ODE 系统函数必须是
def fun(s, u):
x, y, F, a = u;
dxds=np.cos(a)
dyds=np.sin(a)
dFds=-beta * x * np.cos(a) + np.sin(a)
dads=(beta * x * np.sin(a) + np.cos(a) ) / F
return dxds, dyds, dFds, dads
现在只有4个边界条件槽可用,分别是绳子的起点坐标和终点坐标。
def bc(ua, ub):
return ua[0], ub[0], ua[1], ub[1] - 0.6
另外,s
的间隔长度也是绳子的长度,所以0.5的值对于给定的杆子坐标是不可能的,试试1.0。需要进行一些实验才能获得不会导致 BVP 求解器中出现奇异雅可比行列式的初始猜测。最后我在 x-y 平面上得到了解决方案
与组件