今年寒假有幸受邀去给一群孩子们教python编程,最后一堂课出了一道应用题,实际上是用方程的思想去解决。我仔细一想我学c语言和c++的时候好像确实没有注意过怎么用编程去解方程。学c语言的时候我倚仗着c语言是编译型代码的快速和高效把区间设置的很大,它总能在不太长的时间内给我答案,可是python从0遍历到300就需要将近半分钟的时间这肯定是不现实的,好在孩子们的方程的解大都是100以内的正整数。所以我琢磨怎幺用高级一点的办法解方程。
由于最后一节课时间比较紧迫,我只讲了第一种方法,因为在此之前我还要铺垫循环和条件语句等知识,只有少数孩子完全理解了,要了我的联系方式要我把其它方法也讲一下。现在我直接把3种方法贴出来供大家参考
用python解方程的三个方法
一:遍历法
在解的范围内尝试所有的可能性,知道找出解,然后把解数出来,跳出循环,
例一: 3*x=12
x = 0while 1: # 1即表示执行循环,就不用判断了x = x+1 # 每次循环x值+1if 3*x == 12: # 判断,如果等式成立(相当于1),执行以下缩进后的代码,如果等式不成立(相当于0),就不执行下面缩进后的代码print(“x=”, x) # (这里缩进后的代码指5,6行)break # 找到解后要跳出循环# (大于0的一元一次方程解法)
例二:这是个二元一次方程组,同样的,我们用遍历法,不过既然是两个未知数,我们不妨试遍所有的(x,y)组合,0和1,0和2,0和3…..0和9,然后1和1,1和2,1和3…..,然后以此类推.所以这就用到了循环的嵌套。下面给出代码。遍历法的前提是你必须知道解在那个区间,哪个范围内,不然你永远也找不到解
x+y=15
x-y=5
x=0while x<100:x=x+1y=0while y<100:y=y+1if x+y==15 and x–y==5:#这个and是且的意思,初学者大可把它理解成”并且”print(x,y)break
二:公式法,原理为克拉默法则,适用于解线性方程组
直线l1:a1x+b1y+c1=0 直线l2:a2x+b2y+c2=0 交点坐标为((b1*c2-b2*c1)/(a1*b2-a2*b1),(a2*c1-a1*c2)/(a1*b2-a2*b1)),交点坐标即方程的解。所以,解为
x=(b1*c2-b2*c1)/(a1*b2-a2*b1)
y=(a2*c1-a1*c2)/(a1*b2-a2*b1)
y=(a2*c1-a1*c2)/(a1*b2-a2*b1)
初学者记住这个公式即可。唯一需要注意的是,要把方程化为一般式,即ax+by+c=0的形式。
例一:
3*x + 4*y – 49=0,
8*x – y – 14=0,
# 3*x + 4*y – 49=0,# 8*x – y – 14=0,a1 = 3a2 = 8b1 = 4b2 = –1c1 = –49c2 = –14x = (b1*c2–b2*c1)/(a1*b2–a2*b1)y = (a2*c1–a1*c2)/(a1*b2–a2*b1)print(“x=”, x, “y=”, y)
三:利用第三方库,在此之前要去安装第三方库,最简单的方法是打开命令行(cmd),输入:pip3 install sympy 然后等待安装。https://blog.csdn.net/goog_man/article/details/88557774这个网址提供了三种安装第三方库的方法,当然,首选是用命令行安装。然后调用库函数,定义标识符(标识符就是相当于你给未知数起的名字),也是先把方程化成一般式,把方程的一般式的左边作为solve函数第一个参数,把标识符作为第二个参数。初学者大可不必纠结什么是库函数,什么是函数,什么是参数,什么是命令行,把环境配置好后就把它暂且当作一种格式记住即可,比如,第一行是死的,背住,第二行第三行其实就是为了指明我方程里面的未知数用什么表示,输出来的结果用什么字母表示,最后一行实际上是一个函数的嵌套调用,它实际上还是个输出语句,不过里面的东西长了点,solve是函数名,括号里面是方程和标识符,记住即可。这个例子里面,我为了区分方程中的标识符和解中的标识符是不一样的,我特意写的有点别扭。我们可以看到,在方程里面写的,是我中间两行赋值号左边的东西,而输出结果的标识符,却是中间两行赋值号右边的东西
例一:
3*x + 4*y – 49=0
8*x – y – 14=0
from sympy import *x2 = Symbol(‘x1’)y = Symbol(‘y1’)print(solve([3*x2 + 4*y – 49, 8*x2 – y – 14], [x2, y]))
输出结果是
{x1: 3, y1: 10}
0 条评论