重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
方法/步骤
创新互联专注于蒙阴网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供蒙阴营销型网站建设,蒙阴网站制作、蒙阴网页设计、蒙阴网站官网定制、成都小程序开发服务,打造蒙阴网络公司原创品牌,更为您提供蒙阴网站排名全网营销落地服务。
用Python解数学方程,需要用到Python的一个库——SymPy库。
SymPy是符号数学的Python库,它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。
如果你的电脑上还没有安装sympy库,那就赶紧安装吧,安装命令:
pip3 install sympy
请点击输入图片描述
先来解一个简单点的方程吧。
题目: 5x + 20 = 100
先直接上代码:
from sympy import *
x = Symbol('x')
print(solve([5*x + 20 - 100], [x]))
请点击输入图片描述
再来一个复杂点的二元一次方程吧。
题目:3x + 4y =49, 8x- y = 14
代码如下:
from sympy import *
x = Symbol('x')
y = Symbol('y')
print(solve([3*x + 4*y - 49, 8*x - y - 14], [x, y]))
请点击输入图片描述
有没有发现规律呢,简单总结一下:
1)变量赋值,使用symbol函数转换;
2)将方程式移到方程的左边,使右边等于0;
3)使用solve函数解方程。
当然了,python的基础语法必须掌握,至少需要掌握python最基础的算数运算符。
+ 加 ---- 两个对象相加
- 减 ----- 得到负数或是一个数减去另一个数
* 乘 ----- 两个数相乘或是返回一个被重复若干次的字符串
/ 除 ----- x 除以 y
% 取模 ----- 返回除法的余数
** 幂 ----- 返回x的y次幂
log() 对数-----对数 log()
下面来个难度大点的方程。
请点击输入图片描述
代码如下:
from sympy import *
t = Symbol('t')
x = Symbol('x')
m = integrate(sin(t)/(pi-t), (t, 0, x))
print(integrate(m, (x, 0, pi)))
请点击输入图片描述
import numpy as np
def solve_quad(a,b,c):
if a == 0:
print('您输入的不是二次方程!')
else:
delta = b*b-4*a*c
x = -b/(2*a)
if delta == 0:
print('方程有惟一解,X=%f'%(x))
return x
elif delta 0:
x1 = x-np.sqrt(delta)/(2*a)
x2 = x+np.sqrt(delta)/(2*a)
print('方程有两个实根:X1=%f,X2=%f'%(x1,x2))
return x1,x2
else:
x1 = (-b+complex(0,1)*np.sqrt((-1)*delta))/(2*a)
x2 = (-b-complex(0,1)*np.sqrt((-1)*delta))/(2*a)
print('方程有两个虚根,如下所示:')
print(x1,x2)
return x1,x2
(1) variable = a if exper else b
(2)variable = (exper and [b] or [c])[0]
(2) variable = exper and b or c
上面三种用法都可以达到目的,类似C语言中 variable = exper ? b : c;即:如果exper表达式的值为true则variable = b,否则,variable = c
例如:
a,b=1,2
max = (a if a b else b)
max = (a b and [a] or [b])[0] #list
max = (a b and a or b)
现在大部分高级语言都支持“?”这个三元运算符(ternary operator),它对应的表达式如下:condition ? value if true : value if false。很奇怪的是,这么常用的运算符python居然不支持!诚然,我们可以通过if-else语句表达,但是本来一行代码可以完成的非要多行,明显不够简洁。没关系,在python里其实还是有对应的表达方式的。
import math
a=int(input('请输入a的值:'))
b=int(input('请输入b的值:'))
c=int(input('请输入c的值:'))
derta=(b**2-4*a*c)
if a == 0:
print('您输入的a为0,方程ax^2+bx+c=0不能作为一元二次方程')
elif derta0:
print('方程无实数解')
elif derta==0:
print('方程有解,有一个实数解:')
print(b*(-1)/(a*2))
else:
print('方程有解,有两个实数解:')
print((-1*b+math.sqrt(derta))/2*a)
print((-1*b-math.sqrt(derta))/2*a)
完全的暴力:
i=0
while (~i1) or (i%3!=2) or (i%5!=4) or (i%6!=5):
i+=7
print i
考虑数学上的优化——
设阶梯数为x,则可联立以下同余方程:
x=1(mod 2)
x=2(mod 3)
x=4(mod 5)
x=5(mod 6)
x=0(mod 7)
前四个同余方程又可改写为:
x=2-1=-1(mod 2)
x=3-1=-1(mod 3)
x=5-1=-1(mod 5)
x=6-1=-1(mod 6)
联立得:x=-1(mod lcm(2,3,5,6)=30)
交上最后一个同余方程得:x%30==29且x%7==0
到这步时,便可以再打一个暴力:
i=0
while i%30!=29:
i+=7
print i
考虑继续优化——
原同余方程又可改写为:
x=30*m+29(m∈N)
x=7*n(n∈N+)
联立得:
30*m+29=7*n
即:n=(30*m+29)/7=4*m+4+(2*m+1)/7
∵n∈N+
∴(2*m+1)/7∈N
∴m=3(mod 7)
∴m最小为3,n最小为17,x最小为119
于是有O(1)的程序:
print 119