SciPy怎么求解多变量函数的根?

文章导读
Previous Quiz Next 多变量函数求根 在 SciPy 中指的是找到多个变量的值的过程,这些变量通常表示为一个向量,满足一组非线性方程组,即求解多变量函数的根或零点。换句话说,可以说它涉及找到向量值函数 F(x)=0 的点,其中 F(x) 是一组方程,x
📋 目录
  1. SciPy 如何帮助求根?
  2. 为什么使用 SciPy 求多变量根?
  3. 求多函数的根
  4. 求解更多方程和变量的系统
A A

SciPy - 多变量函数求根



Previous
Quiz
Next

多变量函数求根 在 SciPy 中指的是找到多个变量的值的过程,这些变量通常表示为一个向量,满足一组非线性方程组,即求解多变量函数的根或零点。换句话说,可以说它涉及找到向量值函数 F(x)=0 的点,其中 F(x) 是一组方程,x 是变量向量。

SciPy 如何帮助求根?

在 SciPy 中,我们有函数 scipy.optimize.root(),用于求解多变量非线性方程组的根。它是 scipy.optimize 模块的一部分,该模块提供了优化和求根例程。该 root 函数允许我们通过提供初始猜测并选择各种求解系统的方法来解决这些方程组。

为什么使用 SciPy 求多变量根?

以下是使用 SciPy 进行多变量求根的原因 −

  • 健壮且灵活的算法: SciPy 提供了多种求解器,如 'hybr'、'lm'、'broyden1' 等,这些求解器针对不同的非线性系统进行了优化,使其适用于多样化的问题。
  • 处理复杂系统: 它可以求解缺乏解析解的耦合非线性方程。
  • 易于使用: 简单的接口让用户能够定义方程、提供初始猜测并高效求解。
  • 自动或自定义 Jacobian: SciPy 可以近似导数,或接受用户提供的 Jacobian 以实现更快收敛。
  • 适用于大型系统: 如 'broyden1' 等求解器可以在无需显式 Jacobian 的情况下处理大型系统。
  • 可靠且优化: 基于 MINPACK 等可信库构建,确保准确性和性能。
  • 集成性: 与 NumPy、Matplotlib 和 SymPy 无缝集成,支持端到端工作流程。
  • 诊断工具: 提供详细的输出,用于收敛、残差和解验证。

Syntax

以下是用于求多变量函数根的函数 scipy.optimize.root() 的语法 −

scipy.optimize.root(
   fun, 
   x0, 
   args=(), 
   method='hybr', 
   jac=None, 
   tol=None, 
   options={}
)

Parameters

  • fun(callable): 要求根的函数。它应接受一个数组 x 并返回相同形状的数组。
  • x0(array_like): 解的初始猜测。
  • args(tuple, optional): 传递给函数 fun 的额外参数。
  • method(str, optional): 要使用的算法。可选值包括 'hybr'、'lm'、'broyden1'、'anderson' 等。
  • jac(callable, optional): 用于计算 fun 的 Jacobian 矩阵的函数。如果未提供,则使用有限差分。
  • tol(float, optional): 终止容差。
  • options(dict, optional): 求解器特定的选项,如最大迭代次数或详细程度。

Return Value

scipy.optimize.root() 返回一个 OptimizeResult 对象,其中包含以下值 −

  • x: 解数组。
  • success: 指示求解器是否成功的布尔值。
  • message: 终止原因的描述。
  • fun: 解处的残差。

求多函数的根

在本例中,我们将求解涉及多个变量的多函数方程组的根,即方程 f1(x,y) = ex+y2-1 = 0f2(x,y) = x3+3x2+1 = 0

import numpy as np
from scipy.optimize import root

# 定义非线性方程组
def fun_system(vars):
    x, y = vars
    # f1(x, y) = e^x + y^2 - 1
    # f2(x, y) = x^3 - 3x + 1
    f1 = np.exp(x) + y**2 - 1
    f2 = x**3 - 3*x + 1
    return [f1, f2]  # 返回两个残差

# [x, y] 的初始猜测值
initial_guess = [0.0, 0.0]

# 使用 root 求解方程组
result = root(fun_system, initial_guess)

# 显示结果
if result.success:
    print(f"Roots found: x = {result.x[0]}, y = {result.x[1]}")
else:
    print(f"Root finding failed: {result.message}")

以下是函数 scipy.optimize.root() 的输出,该函数用于求多函数的根 −

Root finding failed: The iteration is not making good progress, as measured by the
  improvement from the last ten iterations.

求解更多方程和变量的系统

以下示例展示了如何使用函数 scipy.optimize.root() 求解包含更多方程和变量的系统 −

import numpy as np
from scipy.optimize import root

# 定义方程组
def system_of_equations(x):
   return [
      x[0]**2 + x[1]**2 + x[2]**2 - 9,  # x + x + x = 9
      x[0] + x[1] - x[2] - 1,            # x + x - x = 1
      x[0] - x[1] - x[2] - 2             # x - x - x = 2
   ]

# 解的初始猜测值
x0 = [1, 1, 1]

# 使用 'hybr' 方法(默认)求解系统
result = root(system_of_equations, x0, method='hybr')

# 检查结果并显示解
if result.success:
    print("Solution found:", result.x)
else:
    print("Solver failed:", result.message)

以下是函数 scipy.optimize.root() 的输出,该函数用于求解包含更多方程和变量的系统 −

Solution found: [ 2.70256242 -0.5         1.20256242]