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

如何用fsolve求解带归一化约束的多向量方程?

问题解答

你的代码报错是因为fsolve要求目标函数返回一维数组,但你当前返回的是包含两个数组的元组,不符合接口要求。用fsolve完全可以实现需求,修正后的代码及通用思路如下:

简化示例的正确代码

import numpy as np
from scipy.optimize import fsolve

n = 1000
a = np.ones(n)
b = np.random.rand(n)
# 为确保简化示例有解,先将b归一化(实际问题无需此操作,你已说明解存在)
b = b / b.sum()

def f(x):
    # 计算原n维方程的残差
    residual_main = x / x.sum() - b
    # 计算尺度约束的残差
    residual_scale = x.sum() - 1
    # 拼接为一维数组返回
    return np.concatenate([residual_main, [residual_scale]])

# 求解n维变量x
x = fsolve(f, a)

print(f"解的和为:{x.sum():.4f}")
print(f"解与b的差异:{np.max(np.abs(x - b)):.4f}")

实际复杂非线性函数的通用处理规则

针对你提到的实际复杂问题,只需按以下方式修改目标函数:

  • 将原n维非线性方程的残差放在返回数组的前n个位置
  • 将尺度约束(如x.sum()-1=0)的残差作为返回数组的第n+1个元素
  • 确保返回值是长度为n+1的一维数组
  • 初始猜测值保持为n维数组即可(fsolve会自动求解对应维度的变量)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:10