需要帮助解决 python 中的二阶非线性 ODE

2023-11-22

我真的不知道从哪里开始解决这个问题,因为我对此没有太多经验,但需要使用计算机来解决该项目的这一部分。

我有一个二阶常微分方程:

m = 1220

k = 35600

g = 17.5

a = 450000

b 介于 1000 到 10000 之间,增量为 500。

x(0)= 0 

x'(0)= 5


m*x''(t) + b*x'(t) + k*x(t)+a*(x(t))^3 = -m*g

我需要找到最小的 b 使得解永远不会是正数。我知道图表应该是什么样子,但我只是不知道如何使用 odeint 来获得微分方程的解。 这是我到目前为止的代码:

from    numpy    import    *    
from    matplotlib.pylab    import    *    
from    scipy.integrate    import    odeint

m = 1220.0
k = 35600.0
g  = 17.5
a = 450000.0
x0= [0.0,5.0]

b = 1000

tmax = 10
dt = 0.01

def fun(x, t):
    return (b*x[1]-k*x[0]-a*(x[0]**3)-m*g)*(1.0/m)
t_rk = arange(0,tmax,dt)   
sol = odeint(fun, x0, t_rk)
plot(t_rk,sol)
show()

这实际上并没有产生太多东西。

有什么想法吗?谢谢


要求解二阶 ODE,请使用scipy.integrate.odeint,您应该将其写为一阶 ODE 系统:

我来定义z = [x', x], then z' = [x'', x'],这就是你的系统!当然,你必须插入你的真实关系:

x'' = -(b*x'(t) + k*x(t) + a*(x(t))^3 + m*g) / m

becomes:

z[0]' = -1/m * (b*z[0] + k*z[1] + a*z[1]**3 + m*g)
z[1]' = z[0]

或者,直接称呼它d(z):

def d(z, t):
    return np.array((
                     -1/m * (b*z[0] + k*z[1] + a*z[1]**3 + m*g),  # this is z[0]'
                     z[0]                                         # this is z[1]'
                   ))

现在你可以将它喂给odeint像这样:

_, x = odeint(d, x0, t).T

(The _是一个空白占位符x'我们制作的变量)

为了尽量减少b受最大的限制x总是负数,你可以使用scipy.optimize.minimize。我将通过实际最大化最大值来实现它x,受到它仍然为负的约束,因为我无法想到如何在无法反转函数的情况下最小化参数。

from scipy.optimize import minimize
from scipy.integrate import odeint

m = 1220
k = 35600
g = 17.5
a = 450000
z0 = np.array([-.5, 0])

def d(z, t, m, k, g, a, b):
    return np.array([-1/m * (b*z[0] + k*z[1] + a*z[1]**3 + m*g), z[0]])

def func(b, z0, *args):
    _, x = odeint(d, z0, t, args=args+(b,)).T
    return -x.max()  # minimize negative max

cons = [{'type': 'ineq', 'fun': lambda b: b - 1000, 'jac': lambda b: 1},   # b > 1000
        {'type': 'ineq', 'fun': lambda b: 10000 - b, 'jac': lambda b: -1}, # b < 10000
        {'type': 'ineq', 'fun': lambda b: func(b, z0, m, k, g, a)}] # func(b) > 0 means x < 0

b0 = 10000
b_min = minimize(func, b0, args=(z0, m, k, g, a), constraints=cons)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要帮助解决 python 中的二阶非线性 ODE 的相关文章

随机推荐