python - 联立方程求解器,4 个方程 4 个未知数
问题描述
试图解决一个由 4 个方程和 4 个未知数组成的系统。不断收到“函数调用的结果不是正确的浮点数组”的错误。我是 python 新手,所以我认为问题出在我对方程式的定义中。
我尝试过 fsolve、sympy.solve 以及有无定义。
L0_fcc = 5200
L0_bct = 12000
L0_l = 4700
R = 8.3144
def equations(p):
t, XSnl, XSnfcc, XSnbct = p
GPb_fcc_bct = 489 + 3.52 * t
GPb_fcc_l = 4810 - 8.017 * t
GSn_bct_fcc = 5510 - 8.46 * t
GSn_bct_l = 7179 - 14.216 * t
GSn_fcc_l = 1661 - 5.756 * t
E1 = sp.Eq(GPb_fcc_l + R * t * sp.log((1-XSnl)/(1-XSnfcc)) + L0_l * (XSnl**2) - L0_fcc * (XSnfcc**2))
E2 = sp.Eq(GPb_fcc_bct + R * t * sp.log((1-XSnbct)/(1-XSnfcc)) + L0_bct * (XSnbct**2) - L0_fcc * (XSnfcc**2))
E3 = sp.Eq(GSn_fcc_l + R * t * sp.log(XSnl/XSnfcc) + L0_l * ((1-XSnl)**2) - L0_fcc * ((1-XSnfcc)**2))
E4 = sp.Eq(GSn_bct_l + R * t * sp.log(XSnl/XSnbct) + L0_l * ((1-XSnl)**2) - L0_bct * ((1-XSnbct)**2))
return (E1, E2, E3, E4)
x0 = [300, 0, 0, 0]
t, XSnl, XSnfcc, XSnbct = fsolve(equations, x0)
print(t, XSnl, XSnfcc, XSnbct)`
它应该有 4 个值,其中 3 个应该在 0 和 1 之间。我得到“函数调用的结果不是正确的浮点数组”
解决方案
我不确定为什么您会期望sympy
对象与scipy
求解器交互,它们是完全不同的库。前者是符号对象,后者是数值分析。
解决方案是将以下几行简单地更改为:
E1 = (GPb_fcc_l + R * t * np.log((1-XSnl)/(1-XSnfcc)) + L0_l * (XSnl**2) - L0_fcc * (XSnfcc**2))
E2 = (GPb_fcc_bct + R * t * np.log((1-XSnbct)/(1-XSnfcc)) + L0_bct * (XSnbct**2) - L0_fcc * (XSnfcc**2))
E3 = (GSn_fcc_l + R * t * np.log(XSnl/XSnfcc) + L0_l * ((1-XSnl)**2) - L0_fcc * ((1-XSnfcc)**2))
E4 = (GSn_bct_l + R * t * np.log(XSnl/XSnbct) + L0_l * ((1-XSnl)**2) - L0_bct * ((1-XSnbct)**2))
return (E1, E2, E3, E4)
现在这会导致 aRuntimeWarning: invalid value encountered in long_scalars
和 aRuntimeWarning: divide by zero encountered in double_scalars
最后是 aRuntimeWarning: The iteration is not making good progress, as measured by the improvement from the last ten iterations.
但这是一个算法错误,您必须自己解决。
(几乎可以肯定,开始条件不好,因为XSnl/XSnfcc == 0/0
第一次迭代有一个术语)
寻找方程的数值解往往更像是一门艺术而不是一门科学。
推荐阅读
- java - 从自定义适配器中的 listView 中删除对象
- javascript - mongo 和 NodeJs 中的动态查询要求嵌入文档的字段?
- css - 如何在 angular8 中更改 Angular Material 占位符的位置?
- vba - MS Access 仅显示一个结果
- google-apps-script - 在使用具有剪切和粘贴功能的 Apps 脚本时,如何处理来自 Google 表单的新数据?
- php - 如何使用 PHP 和 MySQL 在复选框中使用布尔值
- ios - 在两个字符之间使用正则表达式选择值
- jquery - JQuery UI 复选框单选堆叠在一起而不是并排
- android - 安卓、数据库、谷歌地图
- javascript - JS解构成其他变量