【问题标题】:Euler's method in pythonpython中的欧拉方法
【发布时间】:2015-01-17 00:00:02
【问题描述】:

我正在尝试实现euler's method 来逼近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

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

(不确定 N 是否适合在这里使用...)

【问题讨论】:

  • 你的代码有很多问题,但我想先看看你的错误的整个回溯,复制并粘贴到你的问题中,以及你如何称呼Euler。你能用这些信息完成你的问题吗?蒂亚

标签: python numpy numerical-methods differential-equations approximation


【解决方案1】:

您尝试使用的公式不是欧拉方法,而是当 n 接近无穷大时 e 的确切值wiki

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

Euler's method 用于求解一阶微分方程。

这里有两个指南展示了如何实现欧拉方法来解决一个简单的测试函数:beginner's guidenumerical ODE guide

为了回答这篇文章的标题,而不是你问的问题,我使用欧拉的方法来解决通常的指数衰减:

$\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。

【讨论】:

    【解决方案2】:

    你确定你不是在尝试实现牛顿法吗?因为牛顿法是用来逼近根的。

    如果您决定使用牛顿法,这里是您的代码的略微更改版本,它近似于 2 的平方根。您可以使用您在你想要的东西的近似值。

    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 中是合法但完全不同的(按位)操作。

    【讨论】:

    • 我绝对是指欧拉的方法,但是是的......** 绝对是一个问题。谢谢
    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多