作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解决一个基本上类似于这个的颂歌系统,但多了一个 Spring 和阻尼器 ==> http://scipy-cookbook.readthedocs.io/items/CoupledSpringMassSystem.html
不过,我有一个小问题,因为我要实现的参数之一是时间相关的。我的第一次尝试如下:
import scipy as sci
import numpy as np
import matplotlib.pyplot as plt
def bump(t):
if t <= (0.25 / 6.9):
return (0.075 * (1 - np.cos(np.pi * 8 * 6.9 * t)))
else:
return 0
def membre_droite(w, t, p):
x1,y1,x2,y2,x3,y3 = w
m1,m2,m3,k1,k2,k3,l1,l2,l3,c2,c3 = p
f = [y1,
(-k1 * (x1 - l1 - bump(t)) + k2 * (x2 - x1 - l2) + c2 * (y2 - y1)) / m1,
y2,
(-c2 * (y2 - y1) - k2 * (x2 - x1 - l2) + k3 * (x3 - x2 - l3) + c3 * (y3 - y2)) / m2,
y3,
(-c3 * (y3 - y2) - k3 * (x3 - x2 - l3)) / m3]
return f
# Initial values
x11 = 0.08
y11 = 0
x22 = 0.35
y22 = 0
x33 = 0.6
y33 = 0
# Parameters
m1 = 90
m2 = 4000
m3 = 105
k1 = 250000
k2 = 25000
k3 = 30000
l1 = 0.08
l2 = x22-x11
l3 = x33-x22
c2 = 2500
c3 = 850
# Initial paramaters regrouped + time array
time=np.linspace(0.0, 5, 1001)
w0 = [x11,y11,x22,y22,x33,y33]
p0 = [m1,m2,m3,k1,k2,k3,l1,l2,l3,c2,c3]
x1,y1,x2,y2,x3,y3 = sci.integrate.odeint(membre_droite, w0, time, args=(p0,)).T
plt.plot(time,x1,'b')
plt.plot(time,x2,'g')
plt.plot(time,x3,'r')
plt.plot(time,y2,'yellow')
plt.plot(time,y3,'black')
plt.xlabel('t')
plt.grid(True)
plt.legend((r'$x_1$', r'$x_2$', r'$x_3$', r'$y_2$', r'$y_3$'))
plt.show()
我得到的错误是:
if t <= (0.25 / 6.9):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我寻找过类似的案例并且遇到了这个主题 ==> Solving a system of odes (with changing constant!) using scipy.integrate.odeint?
然后我尝试将我的代码调整为这种格式:
import scipy as sci
import numpy as np
import matplotlib.pyplot as plt
def bump(t):
if t <= (0.25 / 6.9):
return (0.075 * (1 - np.cos(np.pi * 8 * 6.9 * t)))
else:
return 0
def membre_droite(w, t, bump):
x1,y1,x2,y2,x3,y3 = w
f = [y1,
(-250000 * (x1 - x11 - bump(t)) + 25000 * (x2 - x1 - x22 + x11) + 2500 * (y2-y1)) / 90,
y2,
(-2500 * (y2 - y1) - 25000 * (x2 - x1 - x22 + x11) + 30000 * (x3 - x2 - x33 + x22) + 850 * (y3 - y2)) / 4000,
y3,
(-850 * (y3 - y2) - 30000 * (x3 - x2 - x33 + x22)) / 105]
return f
# Initial values
x11 = 0.08
y11 = 0
x22 = 0.35
y22 = 0
x33 = 0.6
y33 = 0
# Initial paramaters regrouped + time array
time = np.linspace(0.0, 5, 1001)
w0 = [x11,y11,x22,y22,x33,y33]
x1,y1,x2,y2,x3,y3 = sci.integrate.odeint(membre_droite, w0, time, args=(bump,)).T
plt.plot(time,x1,'b')
plt.plot(time,x2,'g')
plt.plot(time,x3,'r')
plt.plot(time,y2,'yellow')
plt.plot(time,y3,'black')
plt.xlabel('t')
plt.grid(True)
plt.legend((r'$x_1$', r'$x_2$', r'$x_3$', r'$y_2$', r'$y_3$'))
plt.show()
阅读前面的链接,它应该有效,但我收到另一个错误:
(-250000 * (x1 - x11 - bump(t)) + 25000 * (x2 - x1 - x22 + x11) + 2500 * (y2 - y1)) / 90,
TypeError: 'list' object is not callable
最佳答案
更改为:
from scipy.integrate import odeint
和
x1,y1,x2,y2,x3,y3 = odeint(membre_droite, w0, time, args=(bump,)).T
完整代码:
from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
def bump(t):
if t <= (0.25 / 6.9):
return (0.075 * (1 - np.cos(np.pi * 8 * 6.9 * t)))
else:
return 0
def membre_droite(w, t, bump):
x1,y1,x2,y2,x3,y3 = w
f = [y1,
(-250000 * (x1 - x11 - bump(t)) + 25000 * (x2 - x1 - x22 + x11) + 2500 * (y2 - y1)) / 90,
y2,
(-2500 * (y2 - y1) - 25000 * (x2 - x1 - x22 + x11) + 30000 * (x3 - x2 - x33 + x22) + 850 * (y3 - y2)) / 4000,
y3,
(-850 * (y3 - y2) - 30000 * (x3 - x2 - x33 + x22)) / 105]
return f
# Initial values
x11 = 0.08
y11 = 0
x22 = 0.35
y22 = 0
x33 = 0.6
y33 = 0
# Initial paramaters regrouped + time array
time = np.linspace(0.0, 5, 1001)
w0 = [x11,y11,x22,y22,x33,y33]
x1,y1,x2,y2,x3,y3 = odeint(membre_droite, w0, time, args=(bump,)).T
plt.plot(time,x1,'b')
plt.plot(time,x2,'g')
plt.plot(time,x3,'r')
plt.plot(time,y2,'yellow')
plt.plot(time,y3,'black')
plt.xlabel('t')
plt.grid(True)
plt.legend((r'$x_1$', r'$x_2$', r'$x_3$', r'$y_2$', r'$y_3$'))
plt.show()
关于python - 使用 scipy.integrate.odeint 时如何正确实现时间因变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44164003/
我是 knockout 新手,我有以下问题: 我有来自数据库的 Id,每个 Id 都有其相应的描述(这实际上是 .NET 中的枚举,但我认为这在这个问题中并不重要)。 例如, a) 对于变量“PTyp
我是一名优秀的程序员,十分优秀!