【发布时间】:2019-11-07 07:32:35
【问题描述】:
考虑以下系统:
图 1 - 质量、弹簧、阻尼器和库仑系数(图片由 Wikimedia 提供)。有一个动态方程:
其中Ff 是阿蒙顿-哥伦布摩擦,定义为:
因此,no-slip 条件定义为
在this example之后,我脑子里有一个模糊的代码,我不知道如何完成:
from scipy.integrate import odeint
import numpy as np
m = 1.0
k = 2.0
c = 0.1
mus = 0.3
muk = 0.2
g = 9.8
vf = 0.01
def eq(X, t, Xi):
Ff = k * (Xi[0] - X[0]) + c * (Xi[1] - X[1]) # - m * dydt
if np.abs(X[1]) < vf and np.abs(Ff) < mus * m * g :
Ff = k * (Xi[0] - X[0]) + c * (Xi[1] - X[1]) # - m * dydt
else:
Ff = -np.sign(X[1]) * muk * m * g
pass
dxdt = X[1]
dydt = (k * (Xi[0] - X[0]) + c * (Xi[1] - X[1]) - Ff) / m
return [dxdt, dydt]
t = np.linspace(0, 10, 1000)
Xi0 = np.piecewise(t, [t < 1, t >= 1], [0, 1])
X0 = [0, 0]
sol = odeint(eq, X0, t)
其中Xi0 是一个阶跃函数。我的主要问题是,当我想定义Ff 时,它取决于稍后将在该范围内定义的dydt!
如果您能帮助我了解数值求解该系统的最规范方法,我将不胜感激。提前致谢。
【问题讨论】:
-
我不确定
F_f的给定表达式是否正确。你有这个的来源吗?通常在静态系统中考虑固体摩擦。这实际上是一个关于物理的问题,而不是 python 代码......我会说只有在滑点的情况下才需要求解动态方程,否则方程是 dX/dt=(acceleration=0, velocity=0)... -
我想我已经在下面的帖子中正确地实现了它。这篇文章中的代码有一些问题。
-
@Foad 如果以下答案中的实现优于问题中的实现,请编辑问题以包含它们(或它们的较短版本等)
标签: python numpy numerical-methods ode