我正在尝试实现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< = 0”。我怀疑这与我如何定义f有关?我在调用euler时尝试直接输入f,但是给了我与未定义的变量相关的错误。我也尝试将f定义为它自己的函数,这给了我一个除0错误。
def f(N):
for n in range(N):
return (1+(1/n))^n
(不确定N是否适合在此使用......)
答案 0 :(得分:2)
你确定你没有尝试实施牛顿方法吗?因为牛顿的方法被用来近似根。
如果你决定使用牛顿方法,这里的代码略有改动,近似于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中完全不同(按位)的操作。
答案 1 :(得分:1)
您尝试使用的公式不是Euler的方法,而是e的精确值,因为n接近无穷大wiki,
$n = \lim_{n\to\infty} (1 + \frac{1}{n})^n$
Euler's method用于求解一阶微分方程。
以下是两个指南,展示了如何实现Euler方法来解决一个简单的测试函数:beginner's guide和numerical ODE guide。
要回答这篇文章的标题,而不是你问的问题,我用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。