不知道为什么我在使用Matplotlib.PyPlot时出错

时间:2017-01-05 21:55:32

标签: python matplotlib graph

我正在编写一些允许用户输入2个变量的代码,然后该程序应该能够根据变量绘制射弹的路径。

我在Python中这样做,使用matplotlib.pyplot作为绘制图形的方法。这是代码:

import math
import matplotlib.pyplot as plt
#Do Maths and stuff
g = 9.81 #Gravitational Constant
r = int(input("Enter angle of Projectile's launch:: "))
u = int(input("Enter intial velocity of projectile: "))
x = 0

while x <= 90:
   y = x * math.tan(r) - (g*(x*x)) / (2*(u*u)*(math.cos(r)*math.cos(r))
   plt.plot(x,y)
   plt.show()

但是当我运行它时,它会说

plt.plot(x,y) 

语法无效。有人知道为什么吗?

谢谢

2 个答案:

答案 0 :(得分:3)

除了lbellomo提到的内容之外,您在y定义的末尾缺少一个括号。更重要的是,您永远不会在循环中更改x的值,因此while循环不会停止。

查看以下代码;我认为收集数据然后绘制它们是一种更好的做法。

import math
import matplotlib.pyplot as plt
#Do Maths and stuff
g = 9.81 #Gravitational Constant
r = int(input("Enter angle of Projectile's launch: "))
u = int(input("Enter intial velocity of projectile: "))
x = 0

xdata=[]
ydata=[]
while x <= 10:
    y = x * math.tan(r) - (g/2)*(x/(u*math.cos(r)))**2
    xdata.append(x)
    ydata.append(y)
    x+=1
plt.plot(xdata,ydata,'-ok')
plt.show() 

这是速度和角度分别为245时的图片:

enter image description here

建议:告诉人们角度和速度的单位是什么(物理的东西!)。

最后的想法:我强烈建议您使用numpy并定义一个功能:

import numpy as np
import matplotlib.pyplot as plt

def projectile(x,v,t):
    """
    x: x values (m)
    v: initial speed (m/s)
    t: launch angle (radian)
    """
    g=9.8 #Gravitational Constant
    y=x * np.tan(t) - (g/2)*(x/(v*np.cos(t)))**2
    return y

r = int(input("Enter angle of Projectile's launch: "))
u = int(input("Enter intial velocity of projectile: "))

xdata = np.linspace(0,10,10)
ydata = projectile(xdata,u,r)
plt.plot(xdata,ydata,'-ok')
plt.show()

答案 1 :(得分:1)

你有3个空格而不是4个空格。

正确缩进:

var url = "http://localhost/AcumaticaDB2562/?ScreenId=AC302000&OpenSourceName=Bills+and+Adjustments&DataID=" + apinvoice.RefNbr;
throw new PXRedirectToUrlException(url, "Open Source")
{
     Mode = PXBaseRedirectException.WindowMode.NewWindow
};

请记住,在python中,缩进非常很重要。

一些建议:

不要改变x的值,它永远不会离开。

当然,您希望暂时取出while x <= 90: y = x * math.tan(r) - (g*(x*x)) / (2*(u*u)*(math.cos(r)*math.cos(r)) plt.plot(x,y) plt.show() ,将所有要点汇总在一起。