You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Numba调用Scipy fsolve时遭遇TypingError错误求助

解决Numba njit函数中调用Scipy fsolve的TypingError问题

错误原因

Numba的njit装饰器启用的nopython模式仅支持被Numba官方兼容的函数/语法,Scipy的fsolve不在兼容列表中,因此Numba无法推断其类型,触发TypingError。

解决方案

方案1:仅用Numba编译目标函数(推荐)

将fsolve的调用移到普通Python函数中,只对需要大量计算的方程组函数FCN3使用njit编译——这是最实用的方案,既保留了Numba对核心计算的加速,又能正常使用Scipy的求解器。

修改后的代码:

from scipy.optimize import fsolve
from numba import njit

def FUN12():
    XGUESS = [8.0, 7.0]
    X = [0.0, 0.0]
    try:
        X = fsolve(FCN3, XGUESS)
    except:
        print("error")
    return X

@njit
def FCN3(X):
    F = [0.0, 0.0]
    F[0] = 4. * pow(X[0], 2) - 3. * X[1] - 7  # pow(X[1],1)可简化为X[1]
    F[1] = 5. * X[0] - 2. * pow(X[1], 2) + 8
    return F

print(FUN12())

方案2:手动实现Numba兼容的求解逻辑(进阶)

如果必须在njit函数内完成求解,可以手动实现数值迭代方法(比如牛顿迭代),所有函数均用njit编译。这种方式无需依赖Scipy,但需要自行处理雅可比矩阵、收敛判断等细节。

示例代码(牛顿迭代求解二元方程组):

from numba import njit
import numpy as np

@njit
def jacobian(X):
    # 计算方程组的雅可比矩阵
    jac = np.zeros((2, 2))
    jac[0, 0] = 8. * X[0]  # 对X[0]求偏导
    jac[0, 1] = -3.         # 对X[1]求偏导
    jac[1, 0] = 5.          # 对X[0]求偏导
    jac[1, 1] = -4. * X[1]  # 对X[1]求偏导
    return jac

@njit
def FCN3(X):
    F = np.zeros(2)
    F[0] = 4. * X[0]**2 - 3. * X[1] - 7
    F[1] = 5. * X[0] - 2. * X[1]**2 + 8
    return F

@njit
def newton_solver(guess, tol=1e-8, max_iter=100):
    X = np.array(guess, dtype=np.float64)
    for _ in range(max_iter):
        F = FCN3(X)
        # 判断收敛
        if np.linalg.norm(F) < tol:
            return X
        # 求解增量
        jac = jacobian(X)
        delta = np.linalg.solve(jac, -F)
        X += delta
    print("迭代未收敛")
    return X

@njit
def FUN12():
    XGUESS = [8.0, 7.0]
    X = newton_solver(XGUESS)
    return X

print(FUN12())

总结

  • 优先选择方案1,实现简单且能最大化利用Numba的加速效果;
  • 方案2仅适合必须在纯Numba环境下运行的场景,需自行处理数值求解的细节。

内容的提问来源于stack exchange,提问作者zangmolk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:07:16