我写了一个计算相对论动能的函数,但是我遇到了一些问题。我在Python Jupyter工作。
我正在使用Taylor来获取 v 的非常小的值(所以我最终因为取消而没有 E = 0)和原始表达式最大的价值。 我必须在1e-6和2.88e8之间计算 v 。
m=1
c=3e8
def E(v):
if (v/c) <= 0.8860:
return ((m*v**2)/2) + ((3*m*v**4)/(8*c**2)) + ((5*m*v**6)/(16*c**4)) + ((35*m*v**8)/(128*c**6))
else:
return (m*c**2)*((1/sp.sqrt(1-(v**2/c**2)))-1)
这给了我非常准确的结果。 现在问题是图形 E ( v )。我必须使用matplotlib(+ numpy和scipy用于其他一切)。这是我为日志日志图写的内容。
xs = np.logspace(-6, 8.5)
fig, ax = plt.subplots(figsize=[10,10])
ax.plot(xs, E(xs))
ax.set_xscale('log')
ax.set_yscale('log')
我收到了一个值错误:
"ValueError: The truth value of an array with more than one element
is ambiguous. Use a.any() or a.all()", and it points at "if (v/c) <= 0.8860:".
这个错误意味着什么,我做错了什么。如果你能帮助我绘图或改变我的功能,我将非常感激。
答案 0 :(得分:0)
您需要创建循环而不仅仅是条件:
m=1
c=3e8
def E(v):
for i in range(len(v)):
if (v[i]/c) <= 0.8860:
return ((m*v**2)/2) + ((3*m*v**4)/(8*c**2)) + ((5*m*v**6)/(16*c**4)) + ((35*m*v**8)/(128*c**6))
else:
return (m*c**2)*((1/sp.sqrt(1-(v**2/c**2)))-1)
xs = np.logspace(-6, 8.5)
fig, ax = plt.subplots(figsize=[10,10])
ax.plot(xs, E(xs))
ax.set_xscale('log')
ax.set_yscale('log')
该条件预计为&#39; v&#39;比较0.8860。 当呈现具有多个值的数组时,它表示它不能为数组赋予True或False。 all()和any()是从列表或数组中提取True或False的方法: 如果任何为真,则any()将给出True,而只有全部为真时,all()才会给出。
答案 1 :(得分:0)
语句if (v/c) <= 0.8860
定义不明确,因为对于v
中的某些值,True
对于其他值,False
为numpy.piecewise
。这有点像询问&#34;人们是否高于1.8米?&#34;没有确定的答案;有些是,有些则不是。该错误告诉您准确指定:您想知道所有人是否更大或者是否有任何一个人超过1.8米?在这里你想要真正了解别的东西:你希望每个条目都有不同的结果,具体取决于条件。
您可以使用v
为某些条件定义不同的功能。还要注意c
的任何条目都不应大于import numpy as np
import matplotlib.pyplot as plt
m=1
c=3.e8
lowv = lambda v:((m*v**2)/2) + ((3*m*v**4)/(8*c**2)) + ((5*m*v**6)/(16*c**4)) + ((35*m*v**8)/(128*c**6))
highv = lambda v:(m*c**2)*(1./np.sqrt(1-(v/c)**2)-1)
E = lambda v : np.piecewise(v, [(v/c) <= 0.8860, (v/c) > 0.8860], [lowv,highv])
xs = 2.9999*np.logspace(-6, 8, num=1000)
fig, ax = plt.subplots(figsize=[10,10])
ax.plot(xs, E(xs))
ax.set_xscale('log')
ax.set_yscale('log')
plt.show()
,因为这会产生无限的能量。
numpy.vectorize
或者,您可以使用v
分别为import numpy as np
import matplotlib.pyplot as plt
m=1
c=3.e8
def E(v):
if (v/c) <= 0.8860:
return ((m*v**2)/2) + ((3*m*v**4)/(8*c**2)) + ((5*m*v**6)/(16*c**4)) + ((35*m*v**8)/(128*c**6))
else:
return (m*c**2)*((1/np.sqrt(1-(v**2/c**2)))-1)
Ev = np.vectorize(E)
xs = 2.9999*np.logspace(-6, 8, num=1000)
fig, ax = plt.subplots(figsize=[10,10])
ax.plot(xs, Ev(xs))
ax.set_xscale('log')
ax.set_yscale('log')
plt.show()
中的每个条目评估现有函数。这当然效率较低,不应用于大型阵列。这没关系太多。
self.member = member