我写了一个计算相对论动能的函数,但我在绘制它时遇到了一些问题。
我使用泰勒的v非常小的值(所以我不会因为取消而导致E= 0)和最大值的原始表达式。我必须在 1e-6 和 2.88 e8 之间计算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)
这给了我非常准确的结果。现在问题是 graphingE(v)。我必须使用 matplotlib (+ numpy 和 scipy for everything else)。这是我为 log-log 图编写的内容。
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:".
这个错误是什么意思,我做错了。如果你能帮我绘制图形或更改我的功能,我将非常感激。
您需要创建一个循环,而不仅仅是一个条件:
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')
该条件应为“v”的值,以与 0.8860 进行比较。当提供具有多个值的数组时,它说它不能为数组提供 True 或 False。all()和 any()是从列表或数组中提取 True 或 False 的方法:any()将给出 True,如果任何为 True,则 all()仅在全部为 True 时。
语句if (v/c) <= 0.8860
没有很好地定义,因为对于v
中的某些值,这是True
对于其他值,它是False
。这有点像问“人们身高超过 1.8 米吗?”没有明确的答案;有些是,有些不是。错误告诉您要指定的条件是:您想知道所有人都比 1.8 大吗?
您可以使用numpy.piecewise
为某些条件定义不同的函数。还要注意,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()
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(10条)