用python求超越方程的根

2024-10-03 00:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我要解下面的超越方程

cos(x)/x=c

对于给定常数c

例如,我在Mathematica中做了一个简短的代码,在那里我生成了常量c的随机值列表

const = Table[RandomReal[{0, 5}], {i, 1, 10}]

(*{1.67826, 0.616656, 0.290878, 1.10592, 0.0645222, 0.333932, 3.59584, \
2.70337, 3.91535, 2.78268}*)

而不是我定义的函数

^{pr2}$

开始寻找根源:

Table[FindRoot[f[x, i] == 0, {x, 0.1}][[1, 2]], {i, 1, Length[const]}]
(*{0.517757, 0.947103, 1.21086, 0.694679, 1.47545, 1.16956, 0.26816, \
0.347764, 0.247615, 0.338922}*)

现在我想用python编写类似的程序(可能使用numpy?)但对于这样的问题,我真的找不到任何好的现有答案。有人能帮忙吗?在


Tags: 函数代码列表定义table常数cos方程
3条回答

或者,您可以使用^{}

import numpy as np
from scipy.optimize import root

def func_cos(x, c):
    return np.cos(x) / x - c

crange = range(1, 11)

res = [root(func_cos, 0.5, args=(ci, )).x[0] for ci in crange]

然后res如下所示:

^{pr2}$

如果您对使用root求解方程组感兴趣,可以选中this answer。在

我过去实现这一点的一种方法是使用scipy.optimize.minimize来找到平方函数的最小值。在

from scipy.optimize import minimize
from numpy import cos

def opt_fun(x, c):
    return (cos(x)/x - c)**2

const = 1.2
res = minimize(lambda x: opt_fun(x, const), x0=0.001)

# Check if the optimization was successful
print(res.success)
# >> True

# Extract the root from the minimization result
print(res.x[0])
# >> 0.65889256782472172

这绝非万无一失,但它可以快速准确。例如,如果有多个根,minimize将从您选择的初始点找到“下坡方向”的根,这就是我在上面选择一个小正值的原因。在

另一个需要注意的问题是数量级相差悬殊的数字,这在最小化问题中总是如此。在你的等式中,当c变得非常大时,第一个正根就变得非常小。如果您在这种情况下尝试寻找根,您可能需要将x缩放到接近1,以获得准确的结果(an example here)。在

对于这种简单的单变量函数,使用Chebfun的python实现,可以很容易地找到感兴趣区间内的所有根。我知道有两个,Chebpy和{a2},它们都很好。在

例如,使用Chebpy,可以执行以下操作来查找间隔[0.5, 12]cos(x)/x - 0.05的根:

from chebpy import chebfun

x = chebfun('x', [0.5, 12])
c = 0.05
f = np.cos(x)/x - c

rts = f.roots()
print(rts)

[ 1.4959 4.9632 7.4711 11.6152]

enter image description here

相关问题 更多 >