gpt4 book ai didi

python - Scipy 寻根法

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:14 26 4
gpt4 key购买 nike

我正在编写一个具有数学函数作为属性的类,比如 f

f 是:

  • 在真实段上定义 [-w;+w]
  • 正数且上界为实数 H
  • 偶数(对于 [-w;+w] 中的所有 x,f(x)=f(-x))且 f(w)=f(-w)=0
  • 在 [-w;+w] 上可微并且它的导数在 [-w;0] 上是正连续的

我的类(class)看起来像:

from scipy.misc import derivative
from scipy.integrate import quad
from math import cosh, sqrt

class Function(object):

w = 1.
PRECISION = 1e-6

def f(self, x):
'''This is an example but f could be
any math function matching requirments above.
'''
return 0.5+1.07432*(1-cosh(x/1.07432))

def deriv_f(self, x):
return derivative(self.f, x, self.PRECISION)

def x_to_arc_length(self, x):
def func(x):
return sqrt(1+self.deriv_f(x)**2)
return quad(func, -self.w, x)[0]

def arc_length_to_x(self, L):
bound = [-self.w, self.w]
while bound[1]-bound[0] > self.PRECISION:
mid= sum(bound)/2
bound[(self.x_to_arc_length(mid)-L > 0)] = mid
return sum(bound)/2

我使用二分法来反转弧长方法,但我正在考虑将其更改为 scipy.optimize 求根方法之一以提高速度。我是 scipy 的新手,必须承认我的数学有点生锈......Scipy 让我在 brentqbrenhridderbisectnewton 之间进行选择.

谁能告诉我最适合这种情况的方法?或者也许有更好的图书馆?

最佳答案

我不是 Python 专家,但我从数值分析中了解到,在您列出的方法(Brent、二分法、Ridder 方法和 Newton-Raphson)中,Brent 方法通常是一般实数标量函数的首选 单个实变量 x 的 f。如您所见here ,如果 f 是连续的,并且该方法应用于具有 f(a)f(b)<0 的区间 [a,b],则布伦特方法可以保证收敛为零,就像二分法一样。对于许多表现良好的函数,布伦特方法比二分法收敛得快得多,但在一些不幸的情况下,它可能需要 N^2 次迭代,其中 N 是迭代次数平分以达到给定的公差。

Newton's method另一方面,当它收敛时,通常比 Brent 收敛得更快,但也存在根本不收敛的情况。对于相同的函数,牛顿法可能收敛也可能不收敛,这还取决于起点和根之间的距离。因此,在通用代码中使用它的风险更大。

关于brentqbrenth的选择,it looks like它们应该非常相似,第一个测试更严格。因此,您可以选择 brentq,或者,如果您有时间,可以在它们之间做一些基准测试。

关于python - Scipy 寻根法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com