如何解决SymPy非线性方程,它的形式是如何求解Sympy中的非线性方程?
y = P*x + Q + sqrt(S*x + T)
的,我知道y(0)
,y'(0)
,y(c)
,y'(c)
。我想找到P
,Q
,S
和T
。并且代表y
作为x
的函数。
我对文档变得非常困惑。请帮忙。
如何解决SymPy非线性方程,它的形式是如何求解Sympy中的非线性方程?
y = P*x + Q + sqrt(S*x + T)
的,我知道y(0)
,y'(0)
,y(c)
,y'(c)
。我想找到P
,Q
,S
和T
。并且代表y
作为x
的函数。
我对文档变得非常困惑。请帮忙。
注意:我的sympy吊死你原来的方程y = P*x + Q + sqrt(S*x + T)
。 我将使用y = P*x + Q + x*x*(S*x + T)
只是为了能够展示sympy求解器如何工作(当它工作时)。
策略:
代码:
# Set up variables and equations
x, y, P, Q, S, T, = sympy.symbols('x y P Q S T')
c, y_0, y_c, dy_0, dy_c = sympy.symbols('c y_0 y_c dy_0 dy_c')
eq_y = P * x + Q + x * x * (S * x + T)
eq_dy = eq_y.diff(x)
# Set up simultaneous equations that sympy will solve
equations = [
(y_0 - eq_y).subs(x, 0),
(dy_0 - eq_dy).subs(x, 0),
(y_c - eq_y).subs(x, c),
(dy_c - eq_dy).subs(x, c)
]
# Solve it for P, Q, S and T
solution_set = sympy.solve(equations, P, Q, S, T, set = True)
# Extract names, individual solutions and print everything
names = solution_set[0]
solutions = list(solution_set[1])
for k in range(len(solutions)):
print('Solution #%d' % (k+1))
for k2, name in enumerate(names):
print('\t%s: %s' % (name, solutions[k][k2]))
输出:
Solution #1
P: dy_0
Q: y_0
S: (c*(dy_0 + dy_c) + 2*y_0 - 2*y_c)/c**3
T: (-c*(2*dy_0 + dy_c) - 3*y_0 + 3*y_c)/c**2
现在,您可以使用这些解决方案之一,做一套.subs(...)
得到y
的功能纯粹是由您的常量和x
。
至于你的原方程...我不知道是否有人应立案sympy一个bug报告,以便他们可以在其提高... :)
眼下求解器在解决其方程的系统中的一些问题更多sqrt
。因此,在下面的代码中,首先删除sqrt
,然后求解方程组。目前求解器对于这些类型的方程式来说速度并不快,执行时间大约需要10秒。
P, Q, S, T, = symbols('P Q S T')
c, y_0, y_c, dy_0, dy_c = symbols('c y_0 y_c dy_0 dy_c')
eq_y = (P*x + Q - y(x))**2 + S*x + T
eq_dy = eq_y.diff(x)
equations = [
(eq_y).subs([(x, 0), (y(0), y_0), (y(x).diff(x).subs(x, 0), dy_0)]),
(eq_dy).subs([(x, 0), (y(0), y_0), (y(x).diff(x).subs(x, 0), dy_0)]),
(eq_y).subs([(x, c), (y(c), y_c), (y(x).diff(x).subs(x, c), dy_c)]),
(eq_dy).subs([(x, c), (y(c), y_c), (y(x).diff(x).subs(x, c), dy_c)])
]
solve(equations, P, Q, S, T)
答:
[(-(y_0 - y_c)/c, y_0, 0, 0), ((2*c*dy_0*dy_c + dy_0*y_0 - dy_0*y_c + dy_c*y_0 - dy_c*y_c)/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c), -(2*c**3*dy_0*dy_c**2 - c**2*dy_0**2*y_0 + 2*c**2*dy_0*dy_c*y_0 - 4*c**2*dy_0*dy_c*y_c + c**2*dy_c**2*y_0 - 2*c**2*dy_c**2*y_c - 2*c*dy_0*y_0**2 + 2*c*dy_0*y_c**2 - 4*c*dy_c*y_0*y_c + 4*c*dy_c*y_c**2 - 2*y_0**3 + 2*y_0**2*y_c + 2*y_0*y_c**2 - 2*y_c**3)/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c)**2, -4*(dy_0 - dy_c)*(c*dy_0 + y_0 - y_c)**2*(c*dy_c + y_0 - y_c)**2/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c)**3, -4*(c*dy_0 + y_0 - y_c)**2*(c*dy_c + y_0 - y_c)**4/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c)**4)]
请交叉检查答案。