Python:寻找非线性方程的多重根

标签 python optimization scipy

假设以下函数:

f(x) = x * cos(x-4)

使用 x = [-2.5, 2.5] 此函数在 f(0) = 0f( -0.71238898) = 0

这是通过以下代码确定的:

import math
from scipy.optimize import fsolve
def func(x):
    return x*math.cos(x-4)
x0 = fsolve(func, 0.0)
# returns [0.]
x0 = fsolve(func, -0.75)
# returns [-0.71238898]

使用 fzero(或任何其他 Python 根查找器)在一次调用中找到两个根的正确方法是什么?是否有不同的 scipy 函数可以执行此操作?

fzero reference

最佳答案

我曾经为此任务编写了一个模块。它基于本书的第 4.3 章 Numerical Methods in Engineering with Python by Jaan Kiusalaas :

import math

def rootsearch(f,a,b,dx):
    x1 = a; f1 = f(a)
    x2 = a + dx; f2 = f(x2)
    while f1*f2 > 0.0:
        if x1 >= b:
            return None,None
        x1 = x2; f1 = f2
        x2 = x1 + dx; f2 = f(x2)
    return x1,x2

def bisect(f,x1,x2,switch=0,epsilon=1.0e-9):
    f1 = f(x1)
    if f1 == 0.0:
        return x1
    f2 = f(x2)
    if f2 == 0.0:
        return x2
    if f1*f2 > 0.0:
        print('Root is not bracketed')
        return None
    n = int(math.ceil(math.log(abs(x2 - x1)/epsilon)/math.log(2.0)))
    for i in range(n):
        x3 = 0.5*(x1 + x2); f3 = f(x3)
        if (switch == 1) and (abs(f3) >abs(f1)) and (abs(f3) > abs(f2)):
            return None
        if f3 == 0.0:
            return x3
        if f2*f3 < 0.0:
            x1 = x3
            f1 = f3
        else:
            x2 =x3
            f2 = f3
    return (x1 + x2)/2.0

def roots(f, a, b, eps=1e-6):
    print ('The roots on the interval [%f, %f] are:' % (a,b))
    while 1:
        x1,x2 = rootsearch(f,a,b,eps)
        if x1 != None:
            a = x2
            root = bisect(f,x1,x2,1)
            if root != None:
                pass
                print (round(root,-int(math.log(eps, 10))))
        else:
            print ('\nDone')
            break

f=lambda x:x*math.cos(x-4)
roots(f, -3, 3)

roots 找到区间 [a, b] 中 f 的所有根。

关于Python:寻找非线性方程的多重根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13054758/

相关文章:

delphi - 有没有更快的 TList 实现?

python - 是否可以使用 k-means 在 scikit/sklearn learn 中使用的 K++ 初始化过程?

java - 欧氏距离,Scipy、纯Python、Java结果不同

python - 如何收集 Django 的钱

python - 在 Python OpenCV 中制作裁剪帧的视频

sql - 在 SQL 查询中选择相邻行

python - 将函数映射到 Scipy/numpy 矩阵的所有列

python - 如何将 pandas.core.series.Series 转换为列表?

python - Python 3 中的 __metaclass__

python - 获得最佳解决方案之后的下一个最佳解决方案