象征性地解决。选择最终表示中的符号
Solving symbolically. Choosing the symbols in the final representation
考虑以下简单的三个表达式:
from sympy import *
x1,y1,x2,y2,x,y,a,xn,yn = symbols('x1 y1 x2 y2 x y a xn yn')
yn = (1 - xn)/(1 - a*xn)
xn = (x - x1)/(x2 - x1)
yn = (y - y1)/(y2 - y1)
我想将 y
表示为 x
、x1
、x2
、y1
、y2
和 a
。
我该怎么做? sub
可以用来做这种扩展/简化吗?
假设您的方程表示等式,而不是变量赋值,那么您的方程组是:
xn = (x - x1)(x2 - x1)
(1 - xn)/(1 - a*xn) = (y - y1)/(y2 - y1)
这可以在 SymPy 中解决如下:
from sympy import *
x1, y1, x2, y2, x, y, a = symbols('x1 y1 x2 y2 x y a')
xn = (x - x1)/(x2 - x1)
yn1 = (1 - xn)/(1 - a*xn)
yn2 = (y - y1)/(y2 - y1)
eq0 = yn1 - yn2
solve(eq0, y)
其中 return 个:
[(a*x*y1 - a*x1*y1 - x*y1 + x*y2 + x1*y1 - x2*y2)/(a*x - a*x1 + x1 - x2)]
一点解释:
xn
不依赖于yn
,所以我们可以把它定义为一个表达式,而不是自己创建一个符号。
- 表达式
eq0
是上面的 yn
等价方程,重新排列为右侧只有 0
。很多数值求解器都有相同的接口,sympy在这里借用一下。
solve
采用等价于 0 的表达式和要求解的符号。这里我们只想求解y
.
solve
的结果是可迭代的解决方案 (list
)。由于 SymPy 只找到一个解决方案,因此列表只有 1 长。其他方程式可能 return 更多。
考虑以下简单的三个表达式:
from sympy import *
x1,y1,x2,y2,x,y,a,xn,yn = symbols('x1 y1 x2 y2 x y a xn yn')
yn = (1 - xn)/(1 - a*xn)
xn = (x - x1)/(x2 - x1)
yn = (y - y1)/(y2 - y1)
我想将 y
表示为 x
、x1
、x2
、y1
、y2
和 a
。
我该怎么做? sub
可以用来做这种扩展/简化吗?
假设您的方程表示等式,而不是变量赋值,那么您的方程组是:
xn = (x - x1)(x2 - x1)
(1 - xn)/(1 - a*xn) = (y - y1)/(y2 - y1)
这可以在 SymPy 中解决如下:
from sympy import *
x1, y1, x2, y2, x, y, a = symbols('x1 y1 x2 y2 x y a')
xn = (x - x1)/(x2 - x1)
yn1 = (1 - xn)/(1 - a*xn)
yn2 = (y - y1)/(y2 - y1)
eq0 = yn1 - yn2
solve(eq0, y)
其中 return 个:
[(a*x*y1 - a*x1*y1 - x*y1 + x*y2 + x1*y1 - x2*y2)/(a*x - a*x1 + x1 - x2)]
一点解释:
xn
不依赖于yn
,所以我们可以把它定义为一个表达式,而不是自己创建一个符号。- 表达式
eq0
是上面的yn
等价方程,重新排列为右侧只有0
。很多数值求解器都有相同的接口,sympy在这里借用一下。 solve
采用等价于 0 的表达式和要求解的符号。这里我们只想求解y
.solve
的结果是可迭代的解决方案 (list
)。由于 SymPy 只找到一个解决方案,因此列表只有 1 长。其他方程式可能 return 更多。