Python - 牛顿方法

时间:2013-11-18 12:49:41

标签: python algorithm function

我是Python的新手,我需要做一个牛顿方法脚本。

我一直在尝试这样做,但我一直在收到错误或没有回复......

这是作业:


函数newton(f, x, feps, maxit),其中包含:

  • 一个函数f(x)
  • 函数f(x)的根的初始猜测x
  • 允许的容差feps
  • 以及允许的最大迭代次数maxit

牛顿函数应使用以下Newton-Raphson算法:

while |f(x)| > feps, do
   x = x - f(x) / fprime(x)

其中fprime(x)是位置x处的一阶导数(df(x)/ dx)的近似值。您应该使用本实验的培训部分中的派生函数。

确保将衍生函数定义从training7.py复制到lab7.py中(有更优雅的方法可以做到这一点,但为了评估的目的,这是我们推荐的最直接的方法)。

如果| f(x)|需要maxit次或更少的迭代次数要小于feps,则应返回x的值:

In [ ]: def f(x):
   ....:     return x ** 2 - 2
   ....:

In [ ]: newton(f, 1.0, 0.2, 15)
Out[ ]: 1.4166666666783148

In [ ]: newton(f, 1.0, 0.2, 15) - math.sqrt(2)
Out[ ]: 0.002453104305219611

In [ ]: newton(f, 1.0, 0.001, 15)
Out[ ]: 1.4142156862748523

In [ ]: newton(f, 1.0, 0.001, 15) - math.sqrt(2)
Out[ ]: 2.1239017571339502e-06

In [ ]: newton(f, 1.0, 0.000001, 15) - math.sqrt(2)
Out[ ]: 1.5949463971764999e-12

这是我试图做的,但这是完全错误的:

def derivative(f, x):
    """A function derivative(f, x) which computes a numerical approximation of
    the first derivative of the function f(x) using central differences."""
    R = (f(x + (10 ** -6) / 2.0) - f(x - (10 ** -6) / 2.0)) / (10 ** -6)
    return R


def newton(f, x, feps):
    """A function newton(f, x, feps, maxit) which takes a function f(x) and
    an initial guess x for the root of the function f(x), an allowed tolerance
    feps and the maximum number of iterations that are allowed maxit. The
    newton function should use the following Newton-Raphson algorithm:
    while |f(x)| > feps, do
    x = x - f(x) / fprime(x)
    where fprime(x) is an approximation of the first derivative (df(x)/dx) at
    position x."""
    while abs(f(x) > feps):
        fprime(x) = derivative(f, x)
        Result = x - f(x) / fprime(x)
        return Result

我应该怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

您在while循环中的第一步后返回结果

    while abs(f(x) > feps):
        fprime(x) = derivative(f, x)
        Result = x - f(x) / fprime(x)
        return Result

这样做

    while abs(f(x) > feps):
        fprime(x) = derivative(f, x)
        Result = x - f(x) / fprime(x)
    return Result

P.S。但我不确定你的代码是否有效fprime(x) = derivative(f, x) - 这不是python的正确语法

我认为此代码必须更正确

    while abs(f(x) > feps):
        x = x - f(x) / derivative(f, x)
    return x

对于牛顿方法,您必须得到递归的结果并检查最佳近似值。

            f(x)
Xn+1 = Xn - -----
            f'(x)

当你最适合自己时,你会检查循环

P.S。抱歉我的伪数学代码