[英]multidimensional Euler's method python
所以我為Euler的方法編寫了一個函數。 但是,我希望它能夠使用任意尺寸的初始條件。 例如,目前我的函數使用這個:
>>>Euler(f, x0, t0, h, N)
其中x0是浮點數。 但是我希望它能夠使用它:
>>>Euler(f, [x0], t0, h, N)
其中x0現在是浮點數列表。 (使其成為多維的)
f =函數,x0 =時間t0的初始條件,
t0 =初始時間,h =步長,N =步數。
我嘗試過使用for循環:
def Euler(f,x0,t0,h,N):
t = t0
y = x0
z = []
v = []
for i in y:
while t <= N:
xval = t
yval = [y]
t += h
y += h * f(t,y[i]) #i have also tried y+= h*f(t, i)
z.append(xval)
v.append(yval)
return z, v
我得到的錯誤是TypeError:list indices必須是整數或切片,而不是float。 我理解,這意味着我必須索引y,如使用y [0],y [1]等...但是當我這樣做時
y + = h * f(t,y [:])
它給我一個關於我在文件中的其他函數的錯誤:f =>
TypeError: a float is required
line 22, in <module> vv = -x**3 - x + sin(t)
當我也試試
y += h * f(t, y[0])
然后我進入
>>>Euler(f, [0., 1.], 0., 1, 10)
line 15, in <module>
y += h * f(t,y[0])
builtins.TypeError: 'float' object is not iterable
我本質上想要返回2個列表,第一個列表是z,其中它返回時間值的列表,第二個列表v,其中它返回每個步驟中每個結果的列表列表。 到目前為止,它已經在我使用浮動但不是列表的地方工作。 那么我錯過了什么代碼?
嘗試這個:
def Euler(f,x0,t0,h,N):
t = t0
z = []
v = []
for y in x0:
while t <= N:
xval = t
yval = [y]
t += h
y += h * f(t,y) #i have also tried y+= h*f(t, i)
z.append(xval)
v.append(yval)
return z, v
我不知道這是否是預期的方法,因為y += h * f(t,y)
是死代碼並且在其他任何地方都沒有使用
我認為錯誤是由於沒有注意變量的類型。 當你做y = x0
時, y
是一個列表。
快進到該行y += h * f(t,y[i])
。 在這里,你嘗試在y
上使用+=
運算符,這樣做是為了將另一個iterable的內容追加到y
。
在同一個語句中,您嘗試使用i
索引到y
。 要索引到一個列表,你需要使用一個整數,但由於i
是y
的元素(它是一個浮點數組), i
不能用於索引到列表中,這就是為什么你可以錯誤:
TypeError:list indices必須是整數或切片,而不是float。
當你這樣做y+= h* f(t, y[:])
,你會得到錯誤:
TypeError:需要一個float
因為y[:]
創建一個包含y
所有元素的新列表,因此您仍然將列表傳遞給您的函數。
最后當你這樣做y += h * f(t, y[0])
,你得到錯誤:
builtins.TypeError:'float'對象不可迭代
因為正如我之前提到的, y
是一個列表,列表上的+=
將另一個iterable的內容追加到當前列表中。 它的方式是在第二個列表上“迭代”並將第二個列表中的項目附加到第一個列表中。 由於值h * f(t, y[0])
不是列表,也不是可迭代的,因此會出現錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.