超越方程的牛顿法

时间:2018-10-05 16:22:02

标签: python math numerical-methods

先验方程: tan(x)/ x + b = 0,其中b是任何实数。 我需要介绍n并给我n个方程的解。

我的代码(Python):

    from math import tan, cos, pi, sqrt, sin,exp
    import numpy as np 
    from matplotlib.figure import Figure
    import matplotlib.pyplot as plt

    def f(x,b):
        return tan(x)/x + b

    def f1(x,b):
        return (x/(cos(x)*cos(x)) - tan(x))/(x**2)

    e = 0.00000000001

    def newtons_method(x0, f, f1, e):
        x0 = float(x0)
        while True:
            x1 = x0 - (f(x0,b) / f1(x0,b))
            if abs(x1 - x0) < e:
                return x1
            x0 = x1

    result = []
    n = int(input("Input n: "))
    b = float(input("Input b: "))
    for i in range(2,4*n,1):
        result.append(newtons_method(i, f , f1, e))
    lambda_result = sorted(list(set(result)))
    print(len(lambda_result))

我用第1步更改初始近似值。以〜pi为周期重复根,因此第二个参数为4 * n。我通过设置排除重复的解决方案。如果n为50,那么他只能找到18个解。要使其正常工作需要解决什么问题?请帮帮我。

1 个答案:

答案 0 :(得分:0)

在交叉发布的https://math.stackexchange.com/q/2942400/115115中,Yves Daoust强烈建议将牛顿方法基于函数

f(x)=sin(x) + b*x*cos(x)

f(x)=sin(x)/x + b*cos(x)

因为这些函数没有极点或其他奇异点(如果x不接近0)。

至少对于大c,解决方案接近初始值(i+0.5)*pi for i in range(n)。然后,结果不需要排序或缩短结果。

可以用一个正弦项在余弦的根部具有交替的符号。这很适合应用括弧法,例如 regula falsi(illinois),Dekker的fzeroin,Brent的方法,...这些方法几乎与牛顿法一样快并确保在间隔内找到根。

唯一的麻烦是间隔(0,pi/2),因为b<-1的根将为非零。必须从x=0中删除寻根过程,这对于接近b的{​​{1}}来说是不容易的。


牛顿法,当初始点离根足够近时,可靠地仅将零输入根。如果该点更远,接近函数的极值,则切线的根可能会很远。因此,要成功应用牛顿法,需要从一开始就找到良好的根近似。为此,可以使用全局收敛的定点迭代或所考虑函数的结构简单近似。

  • 使用收缩定点迭代:-1周围的解决方案也是等效方程k*pi的根。这给出了近似解x+arctan(b*x)=k*pi。由于即使对于较小的x=g(k*pi)=k*pi-arctan(b*k*pi),圆弧切线也相当平坦,因此可以很好地近似。

  • 如果k存在b<-1的正根,则间隔k=0中。在这种情况下,前一种方法不起作用,因为在此间隔内,反正切线的斜率围绕(0,pi/2)。根源于方程的高阶非线性项,因此需要方程的等价形式之一的非线性近似。近似1tan(x)=x/(1-(2*x/pi)^2)处给出相同的极点,并且在两者之间足够接近。将这个近似值插入给定的方程式并求解,即可得出+-pi/2的初始根近似值。

在实现中,必须移动x=pi/2*sqrt(1+1/b)的根集以包括其他第一个解决方案。

b<-1