用python求解多变量方程



我正试图创建一个程序来求解这个方程:

2.5x+3.5y+4.5z+5.5t+6.5w+10.5f=d

我希望能够为d设置一个值,并得到每个变量的正数和整数。

import sympy as sp
import numpy as np

x, y, z, t, w, f = sp.var('x y z t w f', Naturals0=True, positive=True)
var = [x, y, z, t, w, f]
d = 14

Eqn = sp.Eq(2.5*x + 3.5*y + 4.5*z + 5.5*t + 6.5*w + 10.5*f, d)
for i in var:

print(sp.solveset(Eqn, i, domain=sp.S.Naturals0))

我使用上面的代码,但我有两个问题,首先它只给我每个变量的相对答案,我还没有找到一种方法来";控制";只有积极和完整的答案。

我知道,也许我会得到很多结果,这取决于我为d设置的数字,但我需要数字的热,无方程的结果。

最后但同样重要的是,我已经尝试过numpy和矩阵求解,但没有成功。

提前感谢

当您想要方程中多个变量的整数解时,您可能想要使用diophantine;相对于其他变量,solveset更适用于求解单个变量。

对于diophantine,将方程作为具有整数系数的表达式:

>>> from sympy import Add, nsimplify, Eq, symbols, ordered
>>> s = d, f, t, w, x, y, z=symbols('d, f, t, w, x, y, z')
>>> e = Eq(2.5*x + 3.5*y + 4.5*z + 5.5*t + 6.5*w + 10.5*f, d)
>>> nsimplify(e.rewrite(Add), rational=True)
-d + 21*f/2 + 11*t/2 + 13*w/2 + 5*x/2 + 7*y/2 + 9*z/2
>>> eq = _

现在得到一个整数解决方案:

>>> from sympy import diophantine
>>> isol = diophantine(eq, syms=s); isol
{(t_0, t_1, t_1 + t_2, t_1 + t_2 + t_3, t_1 + t_2 + t_3 + t_4,
8*t_0 - 191*t_1 - 107*t_2 - 63*t_3 - 11*t_4 + 9*t_5,
-6*t_0 + 143*t_1 + 80*t_2 + 47*t_3 + 8*t_4 - 7*t_5)}

这是一组整数或变量的元组(在本例中为1(,表示方程的解。在这种情况下,可以自由选择6个参数,然后可以找到特定的解决方案。我们将创建一个函数f,它可以用来轻松查看特定的解决方案:

>>> from sympy import Tuple, Dict, Lambda
>>> tsol = Tuple(*isol.pop())
>>> dsol = Dict(*zip(v, tsol))
>>> p = tuple(ordered(tsol.free_symbols))
>>> f = Lambda(p, dsol)

现在我们可以看到一个特定的解决方案,并看到它满足原始表达式:

>>> f(1,2,3,4,5,6)
{d: 1, f: 2, t: 5, w: 9, x: 14, y: -948, z: 706}
>>> eq.subs(_)
0

因此,存在由6个任意整数决定的无穷多个解,从中可以确定另外两个。

最新更新