skr*_*rat 4 python numpy numeric transcendental-equation
我必须解决以下先验方程
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}*)
Run Code Online (Sandbox Code Playgroud)
比我定义的功能
f[x_, i_] := Cos[x]/x - const[[i]]
Run Code Online (Sandbox Code Playgroud)
并开始寻找根源:
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}*)
Run Code Online (Sandbox Code Playgroud)
现在,我想用python编程类似的东西(可能使用numpy?),但是我真的找不到像这样的问题的任何现有的好答案。有人可以帮忙吗?
我过去实现此目标的一种方法是使用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
Run Code Online (Sandbox Code Playgroud)
这绝不是万无一失的,但是它可以快速准确。例如,如果有多个根,minimize将从您选择的初始点开始在“下坡方向”中找到一个根,这就是为什么我在上面选择了一个小的正值的原因。
对于最小化问题,始终需要注意的另一个问题是数量级明显不同的数字。在您的方程中,当c正数很大时,第一个正根就很小。如果最终想在这种情况下找到根源,则可能需要将两者都缩放x到接近1才能获得准确的结果(此处为示例)。
或者,您可以使用root:
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]
Run Code Online (Sandbox Code Playgroud)
然后res看起来如下:
[0.73908513321516056,
0.45018361129487355,
0.31675082877122118,
0.24267468064089021,
0.19616428118784215,
0.16441893826043114,
0.14143076140757282,
0.12403961812459068,
0.11043425911223313,
0.099505342687387879]
Run Code Online (Sandbox Code Playgroud)
如果您对使用求解方程组感兴趣,root可以查看此答案。