【问题标题】:Numerical Root finding via Newton通过牛顿找到数值根
【发布时间】:2017-06-11 22:10:44
【问题描述】:

我想使用从 scipy.optimize 导入的 Newton 方法找到函数“func”的根(即值 x 使得 f(x)=0)。 我写了以下代码:

import numpy

from scipy import optimize


def A(b, c, e=70):
    d = 1 - c
    b_prime = ((1 + b) ** 3)
    wurzel = numpy.sqrt(c * b_prime + d)

    return e * wurzel

def U(b, c, e=70):
    return A(b, c, e=70)/e

def func(U, c, b, a):
    return U(b, c, e=70)**2 - (U(b, c, e=70)**a * (1-c)) - (c * (1+b)**3)

def func_prime(U, c, a):
    return 2*U(b, c, e=70) - (a*(U(b, c, e=70)**(a-1)))*(1-c)

def U_0(b, c):
    numpy.sqrt((c * (1+b)**3) + 1 - c )

res = optimize.newton(func(U, c, b, a), U_0(b, c), fprime=func_prime(U, c, a), args=(c, b, a))

我通过假设 func 中的 a=0 并求解 U 来分析计算 U_0。 我收到以下错误:

Traceback (most recent call last):
  File "root_finding_stack.py", line 25, in <module>
    res = optimize.newton(func(U, c, b, a), U_0(b, c), fprime=func_prime(U, c, a), args=(c, b, a))
NameError: name 'c' is not defined

错误说 c 没有定义,但这就是重点,我不想定义 a,b 和 c,而是找到 U(a,b,c) 来根我的函数。 我使用了错误的方法还是我在这里做错了什么?另外我不确定我是否在 optimize.newton 函数中正确传递了 3 个参数

编辑:我用数学符号添加了函数

我试图找到一个满足这个方程的 U(b,c)

【问题讨论】:

  • 我不知道 scipy,但你肯定需要传递 .newton 一个函数对象,就像你将 U 传递给 func 一样。相反,您传递的是调用 func(U, c, b, a)result,这意味着如果调用成功,.newton 将获得该 arg 的浮点数。但当然它不会成功,因为这些参数在调用时是未定义的。
  • 你能告诉我们你试图用普通数学符号求根的函数吗?您可以将其作为图像发布在您的问题中。如果你这样做,请告诉我。
  • 我添加了数学符号

标签: python scipy newtons-method


【解决方案1】:

func 是要求解的函数。但是您已经定义了一个函数,该函数作为它的第一个参数,具有另一个函数 U,它是 A, b, c 的函数(和 e,但它是常量)并且 A 也是一个函数。

Newton-Raphson 是一维求解器,因此只能找到 f(x) 而不是 f(g(b,c),a,b,c) 的根,其中 a, b, c 都是未知的。

您似乎也将 python 函数定义和用法与数学函数定义和用法混为一谈。

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2015-12-19
    • 2021-12-20
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多