2013-10-30 76 views
1

所以我最近決定學習python和作爲一個練習(加上做一些有用的事情),我決定做一個歐拉的修正方法算法來求解高於一階的微分方程。一個示例的輸入將是:浮點計算調試

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:我使用python 2.7在OS X

這裏是我的代碼:

#! /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') 

回答

2

當你說y_derivative=y它們是相同的列表名稱不同。即當你改變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

注意,我能夠在IDLE調試這與更換sys.argv您提供的例子。然後,如果打開調試器並單步執行代碼,則可以看到兩個列表都發生更改。

+0

爲什麼y_derivative和y引用同一個列表? 如果我們嘗試使用變量(在使用;而不是換行符): a = 5; b = a; print(a,b)#5 5; a = 6; print(a,b)#6 5; – Michal

+0

變量和列表是完全不同的實體,我添加了另一個鏈接,可以解釋更多的答案 – CDspace