Sympy nsolve使用变量作为非线性方程组初始猜值报错如何解决
问题原因
该报错是因为传入nsolve的初始猜值变量多为numpy数值类型,sympy底层调用mpmath求解时无法正确解析这类类型,导致雅可比矩阵计算异常,最终触发类型错误。
解决方法
将初始猜值列表中的所有变量强制转换为Python原生浮点类型即可,转换可以用float()函数实现。
修改后的调用代码如下:
print(nsolve( [eq1, eq2, eq3, eq4, eq5, eq6, eq7], [J_PV_1, J_PV_2, J_m1, J_m2, Tm1, Tm2, Tpv], [ float(PV_flux), float(PV_flux), float(PV_flux), float(PV_flux), float(Ta_kelvin), float(Ta_kelvin), float(Ta_kelvin + 15) ], domain=S.Reals ))
也可以使用Sympy自带的S()函数将数值转换为Sympy兼容的数值类型,效果一致:
print(nsolve( [eq1, eq2, eq3, eq4, eq5, eq6, eq7], [J_PV_1, J_PV_2, J_m1, J_m2, Tm1, Tm2, Tpv], [ S(PV_flux), S(PV_flux), S(PV_flux), S(PV_flux), S(Ta_kelvin), S(Ta_kelvin), S(Ta_kelvin + 15) ], domain=S.Reals ))
补充说明
你可以先执行print(type(PV_flux))确认变量类型,如果输出为<class 'numpy.float64'>,即可确认是类型兼容问题,按上述方法转换后就能正常运行。
内容的提问来源于stack exchange,提问作者Ben Shalom
相关产品推荐
相关产品推荐

