Python 到 apply/iterate 等式两边的运算

Python to apply/iterate operations onto both sides of an equation

GOAL: 我想把下面的操作顺序变成Python:

  1. 在 LHS 上分离出一个平方根项。
  2. 对等式两边求平方。
  3. 相应地添加和减去项以获得 LHS 上的 0。
  4. 在 LHS 上分离出另一个平方根项。 [即步骤 1)]
  5. 重复步骤 2)。
  6. 重复步骤 3)。
  7. 重复步骤 1)。

等等...

去激进化像 this one and get them into forms like this 这样的方程,即具有 x 整数次方的多项式 p(x)。

我尝试了什么:我试过为此写一个大纲,但我不知道如何为 Python 将其形式化。这是我的作品:

表示法:

EQUATION={ 0 = A + B + C }

    If A has a term to the power if 1/2 then
        If sign of A is + then
            Subtract A FBS ; LHS=-A
            Square BS ; LHS=A^2
            Subtract A^2 FBS ; LHS=0
        Else 
            Add A TBS ; LHS=A
            Square BS ; LHS=A^2
            Subtract A^2 FBS ; LHS=0
    Elif B has a term to the power of 1/2 then
        If sign of B is + then
            Subtract B FBS ; LHS=B
            Square BS ; LHS=B^2
            Subtract B^2 FBS ; LHS=0
        Else
            Add B TBS ; LHS=B
            Square BS ; LHS=B^2
            Subtract B^2 FBS ; LHS=0
    Elif C has a term to the power of 1/2 then
        If sign of C is + then
            Subtract C FBS ; LHS=C
            Square BS ; LHS=C^2
            Subtract C^2 FBS ; LHS=0
        Else
            Add C TBS ; LHS=C
            Square BS ; LHS=C^2
            Subtract C^2 FBS ; LHS=0
    Elif A nor B nor C have terms to the power 1/2 then
        Stop the program

项的符号,ABC不予考虑。在任何情况下,您都必须减去该术语才能使该术语从 RHS.

中消失

所以在第一步中你总是在 LHS 中得到 -X(你输入 LHS=X,但我想这是一个错误)

然后你把两边都平方,得到X^2LHS。 最后一个 Elif 可以只用一个 Else 代替。 所以这是稍微简化的代码

EQUATION={ 0 = A + B + C }

    If A has a term to the power of 1/2 then
            Subtract A FBS ; LHS=-A
            Square BS ; LHS=A^2
            Subtract A^2 FBS ; LHS=0
    Elif B has a term to the power of 1/2 then
            Subtract B FBS ; LHS=-B
            Square BS ; LHS=B^2
            Subtract B^2 FBS ; LHS=0
    Elif C has a term to the power of 1/2 then
            Subtract C FBS ; LHS=C
            Square BS ; LHS=C^2
            Subtract C^2 FBS ; LHS=0
    Else
        Stop the program

现在您可以在简化代码的同时泛化任意数量的术语。 假设方程的形式为 { 0 = SUM },并将 SUM 视为项列表。

然后你可以遍历这些项,直到找到一个平方根:

EQUATION = { 0 = SUM }

    For X in SUM:
        if X has square root then
            Subtract X FBS ; LHS=-X
            Square BS ; LHS=X^2
            Subtract X^2 FBS ; LHS=0
            break
    Else:
        Stop the program   

注意 break 语句。当你找到平方根并进行相应的操作后,你必须简化RHS并重新开始。

for 循环中的 Else 块在循环结束且没有中断时执行。这是因为 python 也适用。

所以整个程序是:

EQUATION = { 0 = SUM }
    While True:
        For X in SUM:
            if X has square root then
                Subtract X FBS ; LHS=-X
                Square BS ; LHS=X^2
                Subtract X^2 FBS ; LHS=0
                break
        Else:
            Stop the program   
        
        # after break continue here
        Simplify RHS

我假设这些项的形式为 x^n * p(x)^0.5,其中 p(x)x 中的多项式。

因此,例如,一个术语将是 x^3 * (x^2 + x)^0.5

为了使用此表达式进行运算,您必须定义如何表示等式的不同部分。

An equation is a list of (2) sums

A sum is a list of terms. 

A term is a list of  (2) factors: 
    A polynomial factor
    A square root of a polynomial

A polynomial is list of coefficients

为了表示所有这些,您可以只使用普通列表,也可以使用从自定义派生的对象 类。

但这两种方法的逻辑是相同的。

我将尝试表示等式 0 = (x+1)^0.5 + x^2 + 4

我说过等式是和的列表,和是项的列表。所以作为第一个近似值可以做的:

         0   =        A     +   B   +  C
eq = [ ['0'] , ['(x+1)^0.5' , 'x^2' , '4' ] ]

我们有一个包含两个列表(和)的列表(等式) 现在我们必须用列表来表示各个术语。

我说过一个项是 2 个因子的列表:一个多项式和一个多项式的平方根。

平方根可以表示为里面的多项式。如果没有平方根,则多项式为1。(1的平方根为1,乘以1没有任何变化)。

为了提高可读性,我将把术语写成元组而不是列表。所以:

             0       =        A       +     B      +     C
eq = [ [ ('0', '1') ], [('1' ,'x+1'), ('x^2', '1'), ('4', '1')] ]

我用引号表示元组中的元素(单项式和平方根)尚未转换为其他表示形式。我们还不知道该怎么做,所以我将其作为标签放在引号中。

为了恢复一个术语的原始表示,我们可以使用这个公式:

Original_term = term[0] * term[1]^0.5

现在,多项式可以用C0CN的系数表示,其中N是多项式的次数,Cn是乘以x^n的系数。例如:

x^3 + 3x^2 := [ 0, 0, 3, 1]
0 =: []
1 = [1]
x = [0 , 1]

现在,我们可以仅使用数字、列表和元组来表示方程。

请记住,项是元组,其中第一个元素是多项式,第二项是平方根,表示为多项式。

术语表示的一些示例:

'0' =: ([], [1])
'1' =: ([1], [1])
'x' =: ([0,1], [1])
'2x^3 (x^2+1)^0.5' =: ([0,0,0,2], [1, 0, 1])

回到等式0 = (x+1)^0.5 + x^2 + 4: 我们在 LHS 中有一个术语,在 RHS 中有 3 个术语,因此表示形式为:

eq = [ [()] , [(), (), ()] ]

现在填写条件:

eq = [ [([], [1])] , [([1,0], [1,1]), ([1,0], [1]), ([4,0], [1])] 

然而表示可以简化:如果没有平方根,那么我们可以用只有一个元素的元组来表示项。所以,伪代码:

If A has a term to the power of 1/2 then

可以翻译成 python 在:

if len(term) == 2:

现在为了实现算法,我们必须定义函数来减去和乘以项。

另请注意,在对 RHS 进行平方后,您必须简化结果。那部分可能很棘手。