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

Python调用fsolve求解非线性方程组出现IndexError越界错误如何解决?

错误原因与解决方案

1 直接报错原因

你触发IndexError: index 1 is out of bounds for axis 0 with size 1的核心问题是调用optimize.fsolve时传入的初始猜测值不符合要求:

  • 你的equations函数中一共定义了15个待求解变量(从vars[0]到vars[14]),要求传入的初始猜测值必须是长度为15的数组
  • 你代码中ans= optimize.fsolve(equations, vars)里的vars是Python内置的全局函数,不是你预设的初始值数组,fsolve读取到的初始值长度仅为1,访问vars[1]自然越界。

2 修复步骤

第一步:定义符合长度要求的初始猜测值

你需要根据业务逻辑给15个未知量设置合理的初始猜测,示例如下(你可以根据实际场景调整初始值):

# 初始值顺序对应x1, x2, lambda1_L, lambda2_L, lambda1_U, lambda2_U, mu1, mu2, mu3, mu4, mu5, mu6, mu7, mu8, W1
init_guess = np.array([0.2, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100])
ans = optimize.fsolve(equations, init_guess)

第二步:修正方程组欠定问题

你当前的equations函数仅返回9个方程,但待求解的未知量有15个,属于欠定方程组,fsolve默认只能求解方程数和未知量数量相等的适定方程组,你需要补全剩余6个方程,或者删除不需要的未知量,否则即使解决索引报错,也无法得到正确的求解结果。

完整修改后参考代码

import numpy as np
from scipy import optimize
import math


def equations(vars):
    x1 = vars[0]
    x2 = vars[1]
    lambda1_L = vars[2]
    lambda2_L = vars[3]
    lambda1_U = vars[4]
    lambda2_U = vars[5]
    mu1 = vars[6]
    mu2 = vars[7]
    mu3 = vars[8]
    mu4 = vars[9]
    mu5 = vars[10]
    mu6 = vars[11]
    mu7 = vars[12]
    mu8 = vars[13]
    W1 = vars[14] 
    sigma_p = math.sqrt(0.028573*x1*x1+0.03129*x2*x2+0.020231*x1*x2)
    A = (0.028573*x1+0.010115*x2)/sigma_p
    B = (0.03129*x2+0.010115*x1)/sigma_p
    eqn1 = 292.7182*lambda1_L+(2.25*A-0.025926)*lambda2_L + 446.444*lambda1_U+(2.25*A-0.040535)*lambda2_U-446.444*mu1-0.405858*mu2+(2*A-0.057146*x1-0.020231*x2)*mu3+mu4-mu5+mu6
    eqn2 = 272.9655*lambda1_L+(2.25*B-0.03633)*lambda2_L+513.4587*lambda1_U+(2.25*B-0.051024)*lambda2_U-513.4587*mu1-0.466781*mu2+(2*B-0.06258*x2-0.020231*x1)*mu3+mu4-mu7+mu8
    eqn3 = mu1*(W1-446.444*x1-513.4587*x2-33)
    eqn4 = mu2*(0.13-0.405858*x1-0.466781*x2)    
    eqn5 = mu3*(x1+x2-1)
    eqn6 = mu5*(0.03-x1)
    eqn7 = mu6*(x1-0.38)
    eqn8 = mu7*(0.05-x2)
    eqn9 = mu8*(x2-0.42)
    # 注意:此处需要你补充剩余6个方程,才能得到唯一解
    return [eqn1, eqn2, eqn3, eqn4, eqn5, eqn6, eqn7, eqn8, eqn9]
    
# 自定义初始猜测值,长度为15
init_guess = np.array([0.2, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100])
ans = optimize.fsolve(equations, init_guess)

print(ans)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:00