在 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 平面上得到了解决方案

与组件