【问题标题】:Python/Sympy: solve equations with different valuesPython/Sympy:求解具有不同值的方程
【发布时间】:2016-12-24 12:08:19
【问题描述】:

我正在尝试解决这三个方程:

a1 + a2 = b1
a2 + a3 = b2
b1 + b2 = c1

我为三个随机选择的变量生成值(不允许组合 b1、b2 和 c1),所以我可能有 a1 = 5、a3 = 10 和 c1 = 100,所以我可以用 sympy 求解该方程.

我的问题是我似乎无法将随机输入传输到代码的 sympy 部分并对其进行循环。

a1, a2, a3, b1, b2, c1 = symbols('a1 a2 a3 b1 b2 c1')
solve([a1.subs(a1, 5) + a2 - b1, a2 + a3.subs (a3, 10) - b2, b1 + b2 - c1.subs (c1, 100)], (a1, a2, a3, b1, b2, c1))

当我假设我在示例中提到的 a1、a3 和 c1 时,这有效,但我事先随机选择了这些变量。我尝试根据选择的变量创建 for 循环,但是三个变量的可能组合太多,所以我放弃了。

【问题讨论】:

  • 我不是 100% 清楚您期望得到什么以及您尝试过什么?你是想告诉 sympy a1a3c1 的值吗?
  • 如果我理解正确:马克,你想从六个变量中随机选择三个并只给出这三个数值,然后用 sympy 解决剩下的三个?
  • @DavidZ:是的,这就是我想要做的!

标签: python sympy


【解决方案1】:

如果我正确理解了您的要求,您可以使用 Sympy 的 linsolve 函数先以符号方式求解方程,然后再用数字替换。关键步骤是告诉linsolve 您要求解哪些变量。我建议使用sets 将您正在求解的变量与您要为其插入值的变量分开。你可以像这样声明你的变量:

all_vars = symbols('a1 a2 a3 b1 b2 c1')
# randomly choose which variables will have values
plug_in_for_vars = ...
solve_for_vars = tuple(set(all_vars) - set(plug_in_for_vars))

然后你可以定义你的方程式

equations = [a1 + a2 - b1, a2 + a3 - b2, b1 + b2 - c1]

并将它们和选择的变量传递给linsolve

solution = linsolve(equations, solve_for_vars)

然后你可以插入选择的值。

solution.subs({variable: value(variable) for variable in plug_in_for_vars})

当然,value(variable) 是您为确定要插入的数值所做的任何事情的代理。

【讨论】:

  • 嗨,我花了很长时间才完成这项工作,但现在可以了。从包含所有变量的元组中删除随机选择的变量的部分我遇到了一些麻烦。出于某种原因,没有任何效果,所以最后,我将这两个集合放在一个列表中,并使用“del”删除了三个变量。非常感谢您的帮助。
  • 嗯,这绝对不是理想的方法,但我猜对你有用。很高兴你成功了。
【解决方案2】:

只有 19 种不同的方法可以做到这一点,所以只是象征性地这样做以查看所有可能性并不算太糟糕:

from sympy import symbols, subsets, solve, Dict
v = a1, a2, a3, b1, b2, c1 = symbols('a1 a2 a3 b1 b2 c1')
eqs = (a1 + a2 - b1, a2 + a3 - b2, b1 + b2 - c1)
# we will not assign b1,b2,c1 so we will never solve for a1,a2,a3
ignore = set(v[:3])
for i in subsets(v, 3):
    if set(i) != ignore:
        subs = set(v)-set(i)
        sol = solve(eqs,i,dict=True)[0]
        print('replace',subs,'solve for',set(sol),':\n\t', sol)

输出是

replace {b2, c1, a3} solve for {a2, a1, b1} :
    {a1: a3 - 2*b2 + c1, a2: -a3 + b2, b1: -b2 + c1}
replace {c1, a3, b1} solve for {a2, b2, a1} :
    {a1: a3 + 2*b1 - c1, a2: -a3 - b1 + c1, b2: -b1 + c1}
replace {b2, a3, b1} solve for {a2, c1, a1} :
    {a1: a3 + b1 - b2, a2: -a3 + b2, c1: b1 + b2}
replace {a2, b2, c1} solve for {a1, a3, b1} :
    {a1: -a2 - b2 + c1, b1: -b2 + c1, a3: -a2 + b2}
replace {a2, c1, b1} solve for {b2, a1, a3} :
    {a1: -a2 + b1, a3: -a2 - b1 + c1, b2: -b1 + c1}
replace {a2, b2, b1} solve for {c1, a1, a3} :
    {a1: -a2 + b1, a3: -a2 + b2, c1: b1 + b2}
replace {a2, c1, a3} solve for {b2, a1, b1} :
    {a1: -2*a2 - a3 + c1, b1: -a2 - a3 + c1, b2: a2 + a3}
replace {a2, b2, a3} solve for {a1, b1} :
    {a1: -a2 - b2 + c1, b1: -b2 + c1}
replace {a2, a3, b1} solve for {b2, a1, c1} :
    {a1: -a2 + b1, b2: a2 + a3, c1: a2 + a3 + b1}
replace {a1, b2, c1} solve for {a2, a3, b1} :
    {a2: -a1 - b2 + c1, a3: a1 + 2*b2 - c1, b1: -b2 + c1}
replace {a1, c1, b1} solve for {a2, b2, a3} :
    {a2: -a1 + b1, a3: a1 - 2*b1 + c1, b2: -b1 + c1}
replace {b2, a1, b1} solve for {a2, c1, a3} :
    {a2: -a1 + b1, a3: a1 - b1 + b2, c1: b1 + b2}
replace {a1, c1, a3} solve for {a2, b2, b1} :
    {a2: -a1/2 - a3/2 + c1/2, b1: a1/2 - a3/2 + c1/2, b2: -a1/2 + a3/2 + c1/2}
replace {b2, a1, a3} solve for {a2, c1, b1} :
    {a2: -a3 + b2, b1: a1 - a3 + b2, c1: a1 - a3 + 2*b2}
replace {a1, a3, b1} solve for {a2, b2, c1} :
    {a2: -a1 + b1, b2: -a1 + a3 + b1, c1: -a1 + a3 + 2*b1}
replace {a1, c1, a2} solve for {b2, a3, b1} :
    {a3: -a1 - 2*a2 + c1, b1: a1 + a2, b2: -a1 - a2 + c1}
replace {a2, b2, a1} solve for {c1, a3, b1} :
    {b1: a1 + a2, c1: a1 + a2 + b2, a3: -a2 + b2}
replace {a2, a1, b1} solve for {b2, a3} :
    {a3: -a2 - b1 + c1, b2: -b1 + c1}
replace {a2, a1, a3} solve for {b2, c1, b1} :
    {b1: a1 + a2, b2: a2 + a3, c1: a1 + 2*a2 + a3}

如果您想查看值,可以执行Dict(sol).subs(dict(zip(subs, (1,2,3)))) 其中1,2,3 是您要使用的值:

Dict(sol).subs(dict(zip(subs, (1,2,3))))
{b1: 3, b2: 4, c1: 7}

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多