浮点计算调试

时间:2013-10-30 19:29:41

标签: python algorithm floating-point differential-equations

所以我最近决定学习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')

1 个答案:

答案 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中对此进行调试。然后,如果打开调试器并单步执行代码,则可以看到两个列表都发生了变化。