计算不绘图的Runge Kutta函数
你好,我正在写一个脚本,用来解决和绘制一个常微分方程(ODE),我使用的是龙格-库塔方法。我希望这个脚本能使用不同的函数,这样我以后可以扩展它。如果我不写函数定义,脚本运行得很好,但如果我加上def(),它就不会打开绘图窗口或者打印结果了。谢谢你!
from numpy import *
import matplotlib.pyplot as plt
#H=p^2/2-cosq
#p=dp=-dH/dq
#q=dq=dH/dp
t = 0
h = 0.5
pfa = [] #Create arrays that will hold pf,qf values
qfa = []
while t < 10:
q = 1*t
p = -sin(q*t)
p1 = p
q1 = q
p2 = p + h/2*q1
q2 = q + h/2*p1
p3 = p+ h/2*q2
q3 = q+ h/2*p2
p4 = p+ h/2*q3
q4 = q+ h/2*p4
pf = (p +(h/6.0)*(p1+2*p2+3*p3+p4))
qf = (q +(h/6.0)*(q1+2*q2+3*q3+q4))
pfa.append(pf) #append arrays
qfa.append(qf)
t += h #increase time step
print("test")
plt.plot(pfa,qfa)
print("test1")
plt.show()
print("tes2t")
1 个回答
1
如果你已经定义了一个函数,那么你需要在某个时候调用它,比如:
def rk(p,q,h):
pass # your code here
if __name__ == '__main__':
rk(1,2,1)
把函数调用放在 if __name__ == '__main__'
这个块里,可以确保只有在你直接运行这个脚本的时候,函数才会被调用,而不是在你从其他脚本导入它的时候。 (如果你感兴趣,可以在这里了解更多:if __name__ == "__main__" 是干什么的?)
还有一个更好的选择;为了避免硬编码函数参数(你的实际代码应该有一些错误处理,以应对意外的命令行输入):
def rk(p,q,h):
pass # your code here
if __name__ == '__main__':
import argparse
the_parser = argparse.ArgumentParser()
the_parser.add_argument('integers', type=int, nargs=3)
args = the_parser.parse_args()
p,q,h = args.integers
rk(p,q,h)