如何使用Python求解乘法形式的非线性方程组?
求解乘法型非线性方程组的Python实现方案
可以实现,根据你的场景可选择两种不同的方案:
方案1:对数转换为线性方程组求解(仅适用于所有系数、未知量、右侧值均为正数的场景)
乘法运算取对数后可直接转换为加法运算,完全适配你之前用的np.linalg.lstsq求解逻辑,运算速度快、结果稳定,不需要调整参数。
原理说明
对乘法等式两边同时取自然对数,即可把乘积转为加和:
比如你的示例方程组3x*4y = 19、2x*2y=23,取对数后变为:
ln(3) + ln(x) + ln(4) + ln(y) = ln(19) ln(2) + ln(x) + ln(2) + ln(y) = ln(23)
转换后即为关于ln(x)、ln(y)的线性方程组,求解后取指数即可得到原未知量的值。
适配你的11维场景的代码逻辑
import numpy as np # 对系数矩阵和右侧向量取对数 ln_A = np.log(A) ln_b = np.log(b) # 构造转换后的线性方程组求解ln(x) # 可根据你的乘积规则调整构造逻辑,求解后取exp得到x ln_x = np.linalg.lstsq(ln_A, ln_b - np.sum(ln_A, axis=1), rcond=None)[0] x = np.exp(ln_x)
方案2:通用非线性求解器求解(支持未知量为负、为0的所有场景)
如果你的场景存在负数或0,无法取对数,可以用scipy.optimize提供的非线性求解工具直接求解,不需要做公式转换。
示例代码(以你给出的2变量场景为例)
import numpy as np from scipy.optimize import fsolve # 定义残差函数:把所有等式移项为 左侧乘积 - 右侧值,求解目标是让残差为0 def equations(vars): x, y = vars eq1 = 3 * x * 4 * y - 19 eq2 = 2 * x * 2 * y - 23 return [eq1, eq2] # 设置初始猜测值,11维场景可直接传入np.ones(11) init_guess = [1, 1] # 求解得到未知量 x, y = fsolve(equations, init_guess)
注意事项
- 非线性方程组可能存在无解、多解的情况,最终求解结果和初始猜测值有关,可根据你的业务场景调整初始值拿到符合预期的解
- 11维的求解规模很小,不需要担心性能问题
内容的提问来源于stack exchange,提问作者Waqar ul islam
相关产品推荐
相关产品推荐

