Python 到 apply/iterate 等式两边的运算
Python to apply/iterate operations onto both sides of an equation
GOAL: 我想把下面的操作顺序变成Python:
- 在 LHS 上分离出一个平方根项。
- 对等式两边求平方。
- 相应地添加和减去项以获得 LHS 上的 0。
- 在 LHS 上分离出另一个平方根项。 [即步骤 1)]
- 重复步骤 2)。
- 重复步骤 3)。
- 重复步骤 1)。
等等...
去激进化像 this one and get them into forms like this 这样的方程,即具有 x 整数次方的多项式 p(x)。
我尝试了什么:我试过为此写一个大纲,但我不知道如何为 Python 将其形式化。这是我的作品:
表示法:
- LHS:(等式的)左侧。
- TBS:(等式的)两边。
- FBS:从(等式的)两边。
- BS:(等式的)两边。
- 分号用于表示每个阶段的 LHS 的期望值。
- “X 有一项的 1/2 次方”我的意思是方程 X 的元素已经 coefficient/variable 提高到那个分数次方。
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
项的符号,A
、B
、C
不予考虑。在任何情况下,您都必须减去该术语才能使该术语从 RHS
.
中消失
所以在第一步中你总是在 LHS
中得到 -X
(你输入 LHS=X
,但我想这是一个错误)
然后你把两边都平方,得到X^2
在LHS
。
最后一个 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
现在,多项式可以用C0
到CN
的系数表示,其中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 进行平方后,您必须简化结果。那部分可能很棘手。
GOAL: 我想把下面的操作顺序变成Python:
- 在 LHS 上分离出一个平方根项。
- 对等式两边求平方。
- 相应地添加和减去项以获得 LHS 上的 0。
- 在 LHS 上分离出另一个平方根项。 [即步骤 1)]
- 重复步骤 2)。
- 重复步骤 3)。
- 重复步骤 1)。
等等...
去激进化像 this one and get them into forms like this 这样的方程,即具有 x 整数次方的多项式 p(x)。
我尝试了什么:我试过为此写一个大纲,但我不知道如何为 Python 将其形式化。这是我的作品:
表示法:
- LHS:(等式的)左侧。
- TBS:(等式的)两边。
- FBS:从(等式的)两边。
- BS:(等式的)两边。
- 分号用于表示每个阶段的 LHS 的期望值。
- “X 有一项的 1/2 次方”我的意思是方程 X 的元素已经 coefficient/variable 提高到那个分数次方。
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
项的符号,A
、B
、C
不予考虑。在任何情况下,您都必须减去该术语才能使该术语从 RHS
.
所以在第一步中你总是在 LHS
中得到 -X
(你输入 LHS=X
,但我想这是一个错误)
然后你把两边都平方,得到X^2
在LHS
。
最后一个 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
现在,多项式可以用C0
到CN
的系数表示,其中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 进行平方后,您必须简化结果。那部分可能很棘手。