用Python编程来解数学方程(纯字符串格式),没想到出人意料的简单。
我们的目标是从字符串直接求解,而不是输入参数。
例如:
一次方程:3x+5=0
二次方程:x^2+2x+1=0
方程组:
3x+5y=11
6x+5y=23
解一次方程
这是最简单的一种情况,这样一个简单的函数就可以实现
def solv(func):
p1, p2= func.split('=')
a1, a2= p1.split('x')
if a2=='':
a2= '0'
x= (float(p2)-float(a2))/ float(a1)
return x
调用测试:
str1= '3x+5=0'
str1= '19x-38=0'
str1= '3x=9'
x= solv(str1)
print(f'{x=}')
解一次方程组
也很简单,这里增加了一个参数读取函数
def getParm(func):
p1, p2= func.split('=')
a1, a2= p1.split('x')
b1, b2= a2.split('y')
if b2=='':
b2= '0'
return float(a1), float(b1), float(b2), float(p2)
def solv2(func1, func2):
a1, b1, c1, d1= getParm(func1)
a2, b2, c2, d2= getParm(func2)
x= ((d1-c1)*b2-(d2-c2)*b1)/(a1*b2- a2*b1)
y= ((d1-c1)*a2-(d2-c2)*a1)/(-a1*b2+ a2*b1)
return x,y
调用测试:
str1= '3x+5y=11'
str2= '6x+5y=23'
x,y= solv2(str1,str2)
print(f'{x=},{y=}')
解二次方程
记得求根公式就没问题
def getParm(func):
p1, p2= func.split('=')
a1, a2= p1.split('x^2')
b1, b2= a2.split('x')
if a1=='':
a1= '1'
if b2=='':
b2= '0'
return float(a1), float(b1), float(b2), float(p2)
def solv3(func):
a, b, c, d= getParm(func)
dt= b*b- 4*a*(c-d)
if dt>=0:
x1= (-b+ dt**(1/2))/(2*a)
x2= (-b- dt**(1/2))/(2*a)
return x1, x2
else:
return None,None
调用测试:
str1= '3x^2-10x-8=0'
# str1= 'x^2-2x+1=0'
# str1= '3x^2+14x+8=0'
x1,x2= solv3(str1)
print(f'{x1=},{x2=}')
扩展
进一步的扩展,是针对缺项的时候做相应的处理;对取参数的函数做通用化;对变量的位置甚至与字母的限制放宽,等等。
应该说,数学学习到这个程度的初中同学,完全可以编写这样的python程序,起到很好的python+数学的互相辅助,互相促进的作用。