所以我最近决定学习python并作为练习(加上一些有用的东西)我决定制作一个Euler's Modified Method算法来求解高阶一阶微分方程。输入的示例如下:
python script_name.py -y[0] [10,0]
其中第一个参数是微分方程(这里:y''= - y),第二个参数是初始条件(这里:y(0)= 10,y'(0)= 0)。然后,它意味着将resusts放到两个文件(x-data.txt和y-data.txt)中。
继承人的问题: 在运行时,具有指定最后一行(在t = 1)的代码读取-0.0,但如果解决ODE(y = 10 * cos(x)),则应读取5.4。即使你用笔和纸来完成程序并执行代码,你的(和计算机)也会在第二次迭代时产生分歧。知道是什么导致了这个吗?
NB :我在os x上使用python 2.7
这是我的代码:
#! /usr/bin/python
# A higher order differential equation solver using Euler's Modified Method
import math
import sys
step_size = 0.01
x=0
x_max=1
def derivative(x, y):
d = eval(sys.argv[1])
return d
y=eval(sys.argv[2])
order = len(y)
y_derivative=y
xfile = open('x-data.txt','w+')
yfile = open('y-data.txt','w+')
while (x<x_max):
xfile.write(str(x)+"\n")
yfile.write(str(y[0])+"\n")
for i in range(order-1):
y_derivative[i]=y[(i+1)]
y_derivative[(order-1)] = derivative(x,y)
for i in range(order):
y[i]=y[i]+step_size*y_derivative[i]
x=x+step_size
xfile.close()
yfile.close()
print('done')
答案 0 :(得分:2)
当您说y_derivative=y
时,它们是具有不同名称的SAME列表。即当您更改y_derivative[i]=y[i+1]
时,两个列表都在变化。您想使用y_derivative=y[:]
复制y
以放入y_derivative
有关详细信息,请参阅How to clone or copy a list?
另见http://effbot.org/zone/python-list.htm
注意,我可以通过用您提供的示例替换sys.argv
来在IDLE中对此进行调试。然后,如果打开调试器并单步执行代码,则可以看到两个列表都发生了变化。