绘制相对论动能

时间:2017-12-03 14:51:09

标签: python matplotlib

我写了一个计算相对论动能的函数,但是我遇到了一些问题。我在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:".

这个错误意味着什么,我做错了什么。如果你能帮助我绘图或改变我的功能,我将非常感激。

2 个答案:

答案 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对于其他值,Falsenumpy.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

enter image description here

或者,您可以使用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