如何用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
相关产品推荐
相关产品推荐

