gpt4 book ai didi

python - Sympy,如何在给定范围内求解具有 2 个未知数的方程

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:01 28 4
gpt4 key购买 nike

假设我定义了两个符号 xy

import sympy as sp

x = sp.symbols('x', integer=True)
y = sp.symbols('y', integer=True)

我知道我可以这样用一个变量求解方程:

expr = 3*x**2 - 12

result = sp.solve(expr, x)
print(result)

[-2, 2]

我可以用

限制解决方案范围
result = sp.solve([expr, x>0], x)
print(result)

Eq(x, 2)

现在,我想用 (0, 10) 范围内的两个未知数求解方程。这是我尝试过的:

expr = 3*x - y - 10
result = sp.solve([expr, x>0, x<10, y>0, y<10], x, y)

但它给出了 NotImplementedError

NotImplementedError: 
inequality has more than one symbol of interest.

是真的没有实现还是我做错了什么?我知道 sympy 是一个强大的库,所以我希望 sympy 能够解决这些问题。我期望的是以下解决方案:

(x=4, y=2), (x=5, y=5), (x=6, y=8)

网上有人建议使用solvesetnonlinsolvelinsolve,但我也无法使用这些方法。

最佳答案

solve 中不等式的使用经常让用户感到困惑。我认为大多数用户都希望像您所说的那样使用不等式来过滤解决方案。然而 solve 实际上期望使用不等式来简化不等式的单变量系统,这是完全不同的,例如:

In [3]: solve([x**2+1<10, x>2])                                                                                                   
Out[3]: 2 < x ∧ x < 3

请注意,solve 返回的是 Boolean 结果,而不是通常返回的 Expr 列表。我认为由于这种交替使用 solve 函数与方程和不等式的混合并不能完全满足用户的期望。为了说明为什么这很有用,我实际上使用了如下所示的 solve

您的示例实际上是一个丢番图问题,因为方程组未定(1 个方程有两个未知数),但您只需要整数解。我自己之前没有使用过丢番图求解器,但我试了一下就想出了这个:

from sympy import *

x, y = symbols('x, y', integer=True)

eq = 3*x - y - 10
conds = [(0 < x), (x < 10), (0 < y), (y < 10)]

# Solve the diophantine equation for solutions in parameter t_0
t, t_0 = symbols('t, t_0', integer=True)
gensol = diophantine(eq, t, [x, y])
((xs, ys),) = gensol

# "Solve" the inequalities for constraints on t_0
conds_t = [cond.subs(x, xs).subs(y, ys) for cond in conds]
conds_t_sol = solve(conds_t, t_0)

# Find the finite set of values for t_0 and sub in to general solution
set_t0 = (conds_t_sol.as_set() & Integers)
sol_set = [(xs.subs(t_0, ti), ys.subs(t_0, ti)) for ti in set_t0]

print(sol_set)

输出是

[(4, 2), (5, 5), (6, 8)]

关于python - Sympy,如何在给定范围内求解具有 2 个未知数的方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59137864/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com