Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 浮点计算调试_Python_Algorithm_Floating Point_Differential Equations - Fatal编程技术网

Python 浮点计算调试

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,作为练习(加上做一些有用的东西),我决定做一个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=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;变量和列表是完全不同的实体,我添加了另一个链接到答案,可以解释更多关于列表的内容