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]
有时候你只需要更加小心:)
我正在尝试使用 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]
有时候你只需要更加小心:)