簡體   English   中英

Euler在python中的方法

[英]Euler's method in python

我正在嘗試實現euler的方法來近似python中e的值。 這是我到目前為止:

def Euler(f, t0, y0, h, N):
    t = t0 + arange(N+1)*h
    y = zeros(N+1)
    y[0] = y0
    for n in range(N):
        y[n+1] = y[n] + h*f(t[n], y[n])
        f = (1+(1/N))^N
    return y

但是,當我嘗試調用該函數時,我收到錯誤“ValueError:shape <= 0”。 我懷疑這與我如何定義f有關? 我在調用euler時嘗試直接輸入f,但是給了我與未定義的變量相關的錯誤。 我也嘗試將f定義為它自己的函數,這給了我一個除0錯誤。

def f(N):
    for n in range(N): 
        return (1+(1/n))^n

(不確定N是否適合在此使用...)

你確定你沒有嘗試實施牛頓方法嗎? 因為牛頓的方法用於近似根。

如果你決定使用牛頓方法,這里是一個稍微改變的代碼版本,它近似於2的平方根。你可以用你在函數中使用的函數及其派生詞改變f(x)fp(x)接近你想要的東西。

import numpy as np

def f(x):
    return x**2 - 2


def fp(x):
    return 2*x

def Newton(f, y0, N):
    y = np.zeros(N+1)
    y[0] = y0
    for n in range(N):
        y[n+1] = y[n] - f(y[n])/fp(y[n])
    return y

print Newton(f, 1, 10)

[ 1. 1.5 1.41666667 1.41421569 1.41421356 1.41421356 1.41421356 1.41421356 1.41421356 1.41421356 1.41421356]

這是兩個平方根的初始值和前十次迭代。

除此之外,一個很大的問題是使用^代替**代表權限,這是一個合法但在python中完全不同(按位)的操作。

你試圖使用的公式不是Euler的方法,而是e的逼近無限維基的e的精確值,

$n = \lim_{n\to\infty} (1 + \frac{1}{n})^n$

歐拉方法用於求解一階微分方程。

這里有兩個指南,展示了如何實現Euler方法來解決一個簡單的測試函數: 初學者指南數字ODE指南

要回答這篇文章的標題,而不是你要問的問題,我用Euler的方法來解決通常的指數衰減:

$\frac{dN}{dt} = -\lambda N$

哪個有解決方案,

$N(t) = N_0 e^{-\lambda t}$

碼:

import numpy as np
import matplotlib.pyplot as plt
from __future__ import division

# Concentration over time
N = lambda t: N0 * np.exp(-k * t)
# dN/dt
def dx_dt(x):
    return -k * x

k = .5
h = 0.001
N0 = 100.

t = np.arange(0, 10, h)
y = np.zeros(len(t))

y[0] = N0
for i in range(1, len(t)):
    # Euler's method
    y[i] = y[i-1] + dx_dt(y[i-1]) * h

max_error = abs(y-N(t)).max()
print 'Max difference between the exact solution and Euler's approximation with step size h=0.001:'

print '{0:.15}'.format(max_error)

輸出:

Max difference between the exact solution and Euler's approximation with step size h=0.001:
0.00919890254720457

注意:我不確定如何正確顯示LaTeX。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM