python:求出两个函数的交集

python: work out intersection of two functions

我正在尝试使用 scipy.optimize.fsolve 来计算 x 截距:

from scipy.optimize import fsolve
from numpy import array, empty

counter = 0


def f(x_):
    global counter
    counter += 1
    return pow(x_, 3) * 3 - 9.5 * pow(x_, 2) + 10 * x_


x0_ = empty(2)
x0_[0] = 1
x0_[1] = 6
res = fsolve(f, x0=x0_)
print(counter)
print(res)

函数 f(x):https://www.desmos.com/calculator/8j8djr01da 此代码的结果是:

74
[0. 0.]

我希望结果是

[0, 1.575, 3.175]

有人可以提供一些帮助吗?

加上: 我无法理解 fsolve(x0) 的文档,这只是一个猜测吗?如果您能解释一下,我将不胜感激。

加上加上: 我将处理许多具有未知表达式和指数的线性方程,我真的在寻找一种方法来计算 x 截距,换句话说,通过 f(x) 的表达式求根。我会很高兴如果你能帮忙的话。

您通过

获得多项式所有根的集合
numpy.roots([3, -9.5, +10, 0])
array([1.58333333+0.90905934j, 1.58333333-0.90905934j,
   0.        +0.j        ])

不清楚你其他期望的真实根是什么,fsolve只会找到真实根0

当然,如果你采用在 Desmos 绘图工具中使用的系数

numpy.roots([2, -9.5, +10, 0])

你实际上会得到预期的

array([3.17539053, 1.57460947, 0.        ])

对于标量非多项式函数,接口 scipy.optimize.find_root 可能更合适,特别是如果您可以提供括号间隔。

我只想说你在第一步定义你的函数是错误的: 应该是

def f(x_):
  #  global counter
  #  counter += 1
    return pow(x_, 3) * 2 - 9.5 * pow(x_, 2) + 10 * x_

但不是pow(x_, 3) * 3 - 9.5 * pow(x_, 2) + 10 * x_

如果您随后精确设置 x0_

x0_=[0,1,3] # according to intersection on graph
res=fsolve(f, x0=x0_)

给你预期的输出:

[0.         1.57460947 3.17539053]

有时候你只需要更加小心:)