首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Prolog库单纯形法求解线性方程组

用Prolog库单纯形法求解线性方程组
EN

Stack Overflow用户
提问于 2021-01-06 01:04:45
回答 1查看 151关注 0票数 2

我正在尝试使用SWI-Prolog simplex library来求解一个以实数集为域的线性方程组。有没有人知道为什么下面的查询不成功?

代码语言:javascript
运行
复制
maximize(
[],
state(
 0,
 [],
 [ 
   c(0,
    [- 0.95*x(3),0.05*x(0),0.05*x(1),0.05*x(2)],
    =,
    1479754163278877r9007199254740992),
   c(0,
    [0.95*x(2),- 0.05*x(0),- 0.05*x(1),- 0.05*x(3)],
    =,
    185786871969449310676024028079063r3975352282315727403093661252059136
   ),
   c(0,
    [0.95*x(1),- 0.05*x(0),- 0.05*x(2),- 0.05*x(3)],
    =,
    756128230024134313216574233897861r15901409129262909612374645008236544
   ),
   c(0,
    [0.95*x(0),- 0.05*x(1),- 0.05*x(2),- 0.05*x(3)],
    =,
    294112628726237r72057594037927936
   )
 ],
 []
),
S).

我打算解决的系统如下:

代码语言:javascript
运行
复制
0.05*x(0)+0.05*x(1)+0.05*x(2)-0.95*x(3)
= 
1479754163278877/9007199254740992

- 0.05*x(0)- 0.05*x(1)+0.95*x(2)- 0.05*x(3) 
=
185786871969449310676024028079063/3975352282315727403093661252059136

- 0.05*x(0)+0.95*x(1)- 0.05*x(2)- 0.05*x(3)
=
756128230024134313216574233897861/15901409129262909612374645008236544

0.95*x(0)- 0.05*x(1)- 0.05*x(2)- 0.05*x(3)
=
294112628726237/72057594037927936

或者,你能知道用Prolog解决这个问题的更好方法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-01-07 00:12:29

看起来求解器假设所有变量都是非负的。所以问题变成了:我们能否将x是自由变量的Ax=b重新表述为使用非负变量的东西?答案是:是的。使用称为变量拆分的技术,我们可以将每个x(j)替换为xplus(j)-xmin(j) where xplus(j),xmin(j)>=0。因此方程系统就变成了:

代码语言:javascript
运行
复制
  sum(j, a(i,j)*(xplus(j)-xmin(j))) = b(i)   for all i
  xplus(j),xmin(j)>=0

我们可能需要确保(xplus(j),xmin(j))对中只有一个可以成为非零。这可以自动保持,因为如果两者都在基矩阵B中,则基矩阵B将变为奇数。但我们也可以设定一个目标来处理这个问题:

代码语言:javascript
运行
复制
  min sum(j, xplus(j)+xmin(j))

只要方程组有一个可行解,目标就会确保只有一个(xplus(j),xmin(j))是非零的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65583359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档