|
|
|
|
@ -0,0 +1,47 @@
|
|
|
|
|
from sympy import *
|
|
|
|
|
from convert_formula import *
|
|
|
|
|
|
|
|
|
|
def solve_differential_equation(input):
|
|
|
|
|
"""
|
|
|
|
|
求解微分方程
|
|
|
|
|
"""
|
|
|
|
|
input = convert_formula(input)
|
|
|
|
|
input = input.replace("''", ".diff(x,2)")
|
|
|
|
|
input = input.replace("'", ".diff(x)")
|
|
|
|
|
input = input.replace("y", "y(x)")
|
|
|
|
|
x = symbols('x')
|
|
|
|
|
y = symbols('y', cls=Function)
|
|
|
|
|
l = input.split('=')
|
|
|
|
|
diffeq = Eq(sympify(l[0]), sympify(l[1]))
|
|
|
|
|
result = dsolve(diffeq, y(x))
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
def test_differential_equation():
|
|
|
|
|
"""
|
|
|
|
|
测试求解微分方程的函数
|
|
|
|
|
"""
|
|
|
|
|
input = "y''+2y'+3y=0"
|
|
|
|
|
result = solve_differential_equation(input)
|
|
|
|
|
assert str(result) == 'Eq(y(x), (C1*sin(sqrt(2)*x) + C2*cos(sqrt(2)*x))*exp(-x))'
|
|
|
|
|
input = "y'-2y=3"
|
|
|
|
|
result = solve_differential_equation(input)
|
|
|
|
|
assert str(result) == 'Eq(y(x), C1*exp(2*x) - 3/2)'
|
|
|
|
|
input = "y'+2y=3"
|
|
|
|
|
result = solve_differential_equation(input)
|
|
|
|
|
assert str(result) == 'Eq(y(x), C1*exp(-2*x) + 3/2)'
|
|
|
|
|
|
|
|
|
|
def UI():
|
|
|
|
|
"""
|
|
|
|
|
微分方程求解器的用户界面
|
|
|
|
|
"""
|
|
|
|
|
while True:
|
|
|
|
|
inputs = input("请输入微分方程(输入q退出):(只支持自变量为x,因变量为y)")
|
|
|
|
|
if inputs == "q":
|
|
|
|
|
break
|
|
|
|
|
result = solve_differential_equation(inputs)
|
|
|
|
|
print("解为:")
|
|
|
|
|
pprint(result)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
test_differential_equation()
|
|
|
|
|
UI()
|