python - 求解大型非线性方程组
问题描述
我正在尝试求解一个由 30 个非线性方程组成的系统(未知变量位于指数函数内)。我正好有 30 个变量和 30 个未知数。我正在尝试使用 scipy.optimize.fsolve 但它基本上没有做任何事情。我将在下面发布我的尝试。
下面,yu,yd,和 Vckm 是已知矩阵,元素范围从 1e-6 到 1,函数 qyuk(ca,cb,lam) 依赖于 Exp[(1 - ca - cb)lam]。我的系统很复杂,因为这个指数必须重现小数字(~1e-6),所以我的解决方案非常敏感。
def f(c):
cq1,cq2,cq3,cu1,cu2,cu3,cd1,cd2,cd3,ce1,ce2,ce3,lu1,lu2,lu3,lu4,lu5,lu6,lu7,lu8,lu9,du1,du2,du3,du4,du5,du6,du7,du8,du9 = c
Gu = [[qyuk(cq1,cu1,lam),qyuk(cq1,cu2,lam),qyuk(cq1,cu3,lam)],
[qyuk(cq2,cu1,lam),qyuk(cq2,cu2,lam),qyuk(cq2,cu3,lam)],
[qyuk(cq3,cu1,lam),qyuk(cq3,cu2,lam),qyuk(cq3,cu3,lam)]]
Gd = [[qyuk(cq1,cd1,lam),qyuk(cq1,cd2,lam),qyuk(cq1,cd3,lam)],
[qyuk(cq2,cd1,lam),qyuk(cq2,cd2,lam),qyuk(cq2,cd3,lam)],
[qyuk(cq3,cd1,lam),qyuk(cq3,cd2,lam),qyuk(cq3,cd3,lam)]]
Gu_squared = np.matmul(Gu,np.transpose(Gu))
Gd_squared = np.matmul(Gd,np.transpose(Gd))
Ul = [[lu1,lu2,lu3],[lu4,lu5,lu6],[lu7,lu8,lu9]]
Dl = [[du1,du2,du3],[du4,du5,du6],[du7,du8,du9]]
rul = np.matmul(np.transpose(Ul),np.matmul(yu,np.matmul(yu,Ul)))
rdl = np.matmul(np.transpose(Dl),np.matmul(yd,np.matmul(yd,Dl)))
rvckm = np.matmul(np.transpose(Ul),Dl)
return (
Gu_squared[0][0] - rul[0][0],Gu_squared[0][1] - rul[0][1],Gu_squared[0][2] - rul[0][2],
Gu_squared[1][0] - rul[1][0],Gu_squared[1][1] - rul[1][1],Gu_squared[1][2] - rul[1][2],
Gu_squared[2][0] - rul[2][0],Gu_squared[2][1] - rul[2][1],Gu_squared[2][2] - rul[2][2],
Gd_squared[0][0] - rdl[0][0],Gd_squared[0][1] - rdl[0][1],Gd_squared[0][2] - rdl[0][2],
Gd_squared[1][0] - rdl[1][0],Gd_squared[1][1] - rdl[1][1],Gd_squared[1][2] - rdl[1][2],
Gd_squared[2][0] - rdl[2][0],Gd_squared[2][1] - rdl[2][1],Gd_squared[2][2] - rdl[2][2],
qyuk(ce1,ce1,lam) - ye[0][0],qyuk(ce2,ce2,lam) - ye[1][1],qyuk(ce3,ce3,lam) - ye[2][2],
Vckm[0][0] - rvckm[0][0],Vckm[0][1] - rvckm[0][1],Vckm[0][2] - rvckm[0][2],
Vckm[1][0] - rvckm[1][0],Vckm[1][1] - rvckm[1][1],Vckm[1][2] - rvckm[1][2],
Vckm[2][0] - rvckm[2][0],Vckm[2][1] - rvckm[2][1],Vckm[2][2] - rvckm[2][2],
)
c = scipy.optimize.fsolve(f,np.full((30,1),.6))
我的问题是 fsolve 正在返回垃圾,而我的解决方案没有解决我的方程组,甚至没有解决。任何帮助,将不胜感激。谢谢你。
解决方案
由于您的系统对其参数和系数非常敏感,因此迭代过程的起点非常重要。如果该点是任意选择的,Newton-Raphson 迭代可能根本不会收敛。此外,非线性系统可能根本没有解,或有多个解。如果你能以某种方式为整个系统提供系数,就可以开始使用它。
推荐阅读
- django - 循环进口动机
- javascript - 快速获取 URL 并删除某些对象
- php - 只有 1 个使用 php 进入 mysql 的多个 json 数组
- angular - Angular 6 ng build --prod 错误:未捕获(承诺):无法读取未定义的属性“调用”
- php - 使用 php 的朴素贝叶斯算法
- amazon-web-services - AWS:从特定 AMI 自动创建现场实例
- javascript - 将值从工厂传递到控制器 angularJS
- spring - Spring sleuth 生成自定义跟踪 id
- git - Git 错误,无法生成/无法分叉索引包
- npm - node.js 中的文本到 Json 转换