在Python中使用Fsolve

本文将探讨我们如何在Python中使用fsolve 来寻找一个解决方案。我们还将探讨使用它的场景和一些示例代码,以更好地理解如何以及何时使用它来达到某种结果。

让我们首先了解什么是fsolve 以及为什么使用它。

Python中的fsolve 函数

方程是数据科学的根基,它们帮助数据科学家、数学家、化学工程师和医生理解他们每天处理的各种情况。现在,随着计算机笼罩在我们的日常生活中,按顺序解决基于大尺度的方程变得更加困难。

Python的fsolve ,使这些专业人士和其他人更容易使用Python库提供的不同模块来解决这些方程。fsolve 基本上是一个SciPy模块,用于返回非线性方程的根。

fsolve 有各种参数,为各种情况提供。这些可以很容易地直接从网上提供的SciPy文档中找到。

这就是fsolve 的整个参数列表的样子:

示例代码:

scipy.optimize.fsolve (func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-08, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)

你可以在SciPy文档中找到所有参数的详细解释以及每个参数的含义。不过,我们将对这些参数进行简要而又容易理解的总结:

参数 说明
func, 可调用f(x, *args) 这基本上是一个函数的描述,它接受一个或多个可能是向量的参数,并返回一个与参数长度相同的值。
x0, ndarray 这个参数标志着函数f(x)=0 ,其根的初始估计值是什么。
args, tuple (可选) 这些是该函数可能需要的任何额外参数。
fprime, 可调用f(x, *args) (可选) 这是一个用于计算函数雅各布估计值的函数,其导数跨越行。
full_output, bool (可选) 如果条件满足或为真,这将返回任何可选的输出值。
col_deriv, bool (可选) 通过这个参数,你可以指定雅各布函数是否沿列计算导数。根据SciPy文档,由于没有转置操作,这样做会更快。
xtol, float (可选) 这个参数将允许函数根据两个连续迭代值之间相对误差的最xtol ,终止计算。
maxfev, int (可选) 这定义了对函数的最大调用次数。
band, tuple (可选) 这是为fprime 被设置为None 。如果参数被设置为包含矩阵内子对角线和超对角线数量的双序列,那么雅可比矩阵被认为是带状的。
epsfcn, float (可选) 如果fprime 被设置为None ,该参数将包含雅各比矩阵前向差分的合适步长。如果epsfcn 小于机器精度,则假定函数的相对误差为机器精度的顺序。
factor, float (可选) 这个参数决定了初始步长边界,必须在(0.1, 100)之间。
diag, sequence (可选) 这些N个正数项作为变量的比例因子。

在Python中使用fsolve 函数来寻找解决方案

现在你可能已经知道了,fsolve 可以用于不同场景下的各种非线性方程。让我们来探索一些简单的代码样本,以更好地掌握fsolve 的使用方法:

找出起点为-0.2的方程的根x+2cos(x)

示例代码:

from math import cos
import scipy.optimize
def func(x):
    y = x + 2*cos(x)
    return y
y = scipy.optimize.fsolve(func,0.2)
print (y)

在这段代码中,我们从Python中庞大的math 库中导入cos 函数,从scipyfsolve 的来源)导入optimize 。接下来,我们定义我们的方程,并将其存储在func 方法的y 中。

在我们的方程被正确初始化后,我们只需使用fsolve 来调用包含方程的方法(func) 。在第二个参数中,我们定义方程的起点。

然后,结果被存储在一个变量y ,打印输出。

代码的输出:

[-1.02986653]

解决一个起点为0和2的方程

示例代码:

from math import cos
import scipy.optimize
def func(x):
        y = [x[1]*x[0] - x[1] - 6, x[0]*cos(x[1]) - 3]
        return y
x0 = scipy.optimize.fsolve(func,[0, 2])
print(x0)

在这段代码中,我们遵循与代码 1 相同的步骤,从 Python 的mathscipy 库中导入cosscipy.optimize 。我们继续进行下一步,在一个叫做func 的方法中定义一个方程。

然后我们在fsolve 函数中调用这个方法作为参数,并向它提供两个起点,0和2,然后将它们存储并打印在一个叫做x0 的变量中。

该代码的输出:

[6.49943036 1.09102209]

找出以0.3为起点的方程的根4sin(y)-4

示例代码:

from math import sin
import scipy.optimize
def func(y):
        x= 4*sin(y) - 4
        return x
x= scipy.optimize.fsolve(func,0.3)
print (x)

在这个示例代码中,我们从math 库中导入sin ,而不是cos 。代码的结构与上面的例子相同,我们还为fsolve 导入scipy.optimize ,然后在方法func 中定义一个方程。

我们把这个方法称为fsolve 中的一个参数,起点为0.3。得到的数值被储存在变量x ,并打印输出。

代码的输出:

[1.57079633]

在这篇文章中,我们了解到fsolve 是用来寻找非线性方程的根的,了解到fsolve 可以接受的不同种类的参数以及每个参数的含义。此外,我们经历了一些fsolve 的工作实例,研究了如何在你的代码中使用它。

现在你已经通过了理论和实际的代码样本,了解了fsolve 是如何用于推导解决方案的,现在是时候创建自己的代码,进一步探索fsolve 的工作原理了。

我们希望你觉得这篇文章对理解如何使用fsolve 来解决 Python 中的问题有帮助。