Pythonic方法解决这个矩阵

时间:2015-02-20 19:19:22

标签: python numpy matrix linear-algebra

我一直在考虑这个问题,但我似乎无法绕过它。

我想用三个具有未知数x,y,z的方程求解矩阵,因此它们都等于相同的数字。

让我说我的等式是:

x + 3 = A
y(2y - 2) = 2A
z(4z - 1) = A

所以我可以构建一个看起来像的矩阵:

[(X + 3) , 0      ,       0] [0]   [A]
[ 0      ,(2y - 2),       0] [y] = [2A]
[ 0 ,    ,       0, (4z -1)] [z]   [A]

我知道numpy has a linear algebra,但只有当答案(A)已知时才会知道。

我的问题是,我是否必须构建一个循环来强制接受(A)的答案,或者是否有更多的pythonic方式来回答这些方程式?

2 个答案:

答案 0 :(得分:3)

您没有包含3个未知数的3个方程组。你有一个3个方程组,有4个未知数:x,y,z和A.

这意味着您的答案将在A上进行参数化,因为您没有足够的等式来解决所有未知数。

解决一般system of polynomial equations可以通过所谓的Groebner基础方法来完成,这就是sympy uses。以下是如何使用该库来解决此类问题或类似问题的片段:

from sympy.solvers.polysys import solve_poly_system
from sympy.abc import x, y, z, A

f1 = x + 3 - A
f2 = y * (2 * y - 2) - 2 * A
f3 = z * (4 * z - 1) - A

solve_poly_system([f1, f2, f3], x, y, z)
# Outputs:
# [(A - 3, -sqrt(4*A + 1)/2 + 1/2, -sqrt(16*A + 1)/8 + 1/8),
# (A - 3, -sqrt(4*A + 1)/2 + 1/2, sqrt(16*A + 1)/8 + 1/8),
# (A - 3, sqrt(4*A + 1)/2 + 1/2, -sqrt(16*A + 1)/8 + 1/8),
# (A - 3, sqrt(4*A + 1)/2 + 1/2, sqrt(16*A + 1)/8 + 1/8)]

如您所见,结果需要将A的值固定为完全确定。

答案 1 :(得分:3)

线性代数只能求解变量的倍数,而不是幂(这就是为什么它被称为线性,即直线的等式,Ax + By + Cz = 0)。

对于这组方程式,您可以使用二次公式来解决:

x + 3 = a            =>       x = a - 3


y * (y - 1) = a      =>       y**2 - y - a = 0

                              y = (1 +/- (1 + 4*a) ** 0.5) / 2

                                = 0.5 +/- (0.25 + a) ** 0.5

                                (a >= -0.25  for real roots)


z * (4*z - 1) = a    =>       4 * z**2 - z - a = 0

                              z = (1 +/- (1 + 16*a) ** 0.5) / 8

                                = 0.125 +/- (0.015625 + 0.25*a) ** 0.5

                                (a >= -0.0625  for real roots)

然后

def solve(a):
    assert a >= -0.625, "No real solution"

    x = a - 3

    yoffs = (0.25 * a) ** 0.5
    ylo = 0.5 - yoffs
    yhi = 0.5 + yoffs

    zoffs = (0.015625 + 0.25 * a) ** 0.5
    zlo = 0.125 - zoffs
    zhi = 0.125 + zoffs

    return [
        (x, ylo, zlo),
        (x, ylo, zhi),
        (x, yhi, zlo),
        (x, yhi, zhi)
    ]