Python 浮点计算调试
所以我最近决定学习python,作为练习(加上做一些有用的东西),我决定做一个Euler的改进方法算法,用于求解高于一阶的微分方程。输入的一个例子是:Python 浮点计算调试,python,algorithm,floating-point,differential-equations,Python,Algorithm,Floating Point,Differential Equations,所以我最近决定学习python,作为练习(加上做一些有用的东西),我决定做一个Euler的改进方法算法,用于求解高于一阶的微分方程。输入的一个例子是: python脚本\u name.py-y[0][10,0] 其中第一个参数是微分方程(此处:y'=-y),第二个参数是初始条件(此处:y(0)=10,y'(0)=0)。然后,它将把恢复结果输出到两个文件(x-data.txt和y-data.txt) 问题是: 当使用指定的参数运行代码时,最后一行(t=1)的读数为-0.0,但如果您求解ODE(y=
python脚本\u name.py-y[0][10,0]
其中第一个参数是微分方程(此处:y'=-y),第二个参数是初始条件(此处:y(0)=10,y'(0)=0)。然后,它将把恢复结果输出到两个文件(x-data.txt和y-data.txt)
问题是:
当使用指定的参数运行代码时,最后一行(t=1)的读数为-0.0,但如果您求解ODE(y=10*cos(x)),则应为5.4。即使你用笔和纸来完成程序并执行代码,你(和计算机)的结果也会因第二次迭代而分离。你知道这是什么原因吗
注意:我正在OSX上使用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')
#/usr/bin/python
#用欧拉修正法求解高阶微分方程
输入数学
导入系统
台阶尺寸=0.01
x=0
x_max=1
def导数(x,y):
d=eval(sys.argv[1])
返回d
y=eval(系统参数[2])
顺序=长度(y)
y_导数=y
xfile=open('x-data.txt','w+'))
yfile=open('y-data.txt','w+'))
而(x当你说y_导数=y
时,它们是同一个列表,名称不同。也就是说,当你改变y_导数[I]=y[I+1]
时,两个列表都在改变。你想用y_导数=y[:]
复制一份y
放入y_导数
有关更多信息,请参阅
也看到
注意,我可以在空闲状态下通过使用您提供的示例替换sys.argv来调试这个。然后,如果您打开调试器并单步执行代码,您可以看到两个列表都发生了变化。为什么y_导数和y引用同一个列表?如果我们尝试使用变量(已使用;而不是换行):a=5;b=a;print(a,b)#5 5;a=6;print(a,b)#6 5;变量和列表是完全不同的实体,我添加了另一个链接到答案,可以解释更多关于列表的内容