1

所以我最近决定学习python,作为一个练习(加上一些有用的东西),我决定制作一个欧拉修正法算法来求解更高的一阶微分方程。一个示例输入是:

python script_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。即使您用笔和纸完成程序并执行代码,您的(和计算机)结果也会在第二次迭代时分开)。知道是什么原因造成的吗?

注意:我在 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')
4

1 回答 1

2

当您说y_derivative=y它们是具有不同名称的相同列表时。即,当您更改y_derivative[i]=y[i+1]两个列表时,它们都会发生变化。你想用y_derivative=y[:]复制y来放y_derivative

请参阅如何克隆或复制列表?了解更多信息

另见http://effbot.org/zone/python-list.htm

请注意,我可以通过替换sys.argv您提供的示例在 IDLE 中进行调试。然后,如果您打开调试器并单步执行代码,您可以看到两个列表都发生了变化。

于 2013-10-30T19:52:21.060 回答