函数用python解决 函数 python

python求解多解问题怎么让方程数量多于未知数值目录
一、多元多次方程
1.1 定义
函数用python解决我们常见的方程组有一元一次方程组 , 比如x 3=5这种,很简单很好解 。
二元一次方程组 , 即方程组中有两个未知数,未知数的最高次数为1.
二元二次方程组函数用python解决:方程组中有两个未知数,未知数的最高次数为2. 。此类方程组均有公式解法或者成形的解法 。
但是面临多元多次方程组,解法错综复杂,是数学家们研究的内容 。为函数用python解决了更好的解决此类问题,我们可以用python来实现 。
1.2 例子
多元多次方程组例如下面这种,三元二次方程组:
下面这种,二元二次方程组 。
第二个方程组实在比较复杂,因此需要借助python 。
二、python求解工具包
python求解方程组的工具包较多 。例如:
numpy:numpy.linalg.solve 可以直接求解线性方程组,numpy是python非常常用的包,解的方程也较为初级 。
scipy:from scipy.optimize import fsolve,可以求解非线性方程组 , 使用较为方便,但是解集并不完备,可能漏掉一下解(后文会给个例子)scipy可以用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化,相对较初级易用
sympy:此工具包功能相对强大,支持符号计算、高精度计算、解方程、微积分、组合数学、离散数学、几何学、概率与统计、物理学等方面的功能 。github地址:
sage,不支持位运算,z3约束求解器,等其函数用python解决他工具包,本文不详述,感兴趣的可以查找相应的内容 。
本文详细讲述scipy以及sympy求解多次方程的方法 。
三、scipy方法
3.1 使用scipy的fsolve求解
我们只将求解方程的部分 。
用fsolve相对初级,也相对简单易操作,代码较为简单,只用将方程的表达式写出运行即可 。fsolve近似看作用最小二乘法求解 。不够很强大,很多情况下解集不完备或者无法解出 。
例如对于
,首先要定义相应的函数:
def solve_function(unsolved_value):
x,y,z=unsolved_value[0],unsolved_value[1],unsolved_value[2]
return [
x**2 y**2-10,
y**2 z**2-34,
x**2 z**2-26,
]
求解函数三个公式都为0时候的解 , 中括号内为初值[0, 0, 0]
solved=fsolve(solve_function,[0, 0, 0])
全部代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
python解方程
"""
from scipy.optimize import fsolve
def solve_function(unsolved_value):
x,y,z=unsolved_value[0],unsolved_value[1],unsolved_value[2]
return [
x**2 y**2-10,
y**2 z**2-34,
x**2 z**2-26,
]
solved=fsolve(solve_function,[0, 0, 0])
print(solved)
print("Program done!")
"""
运行结果:
[-1. 3. 5.]
Program done!
"""
看出运行结果来看,此结果并非完备解集 。因为x,y,z都是可正可负 。例如1或者-1,3或者-3,5或者-5,但是此工具包只能解出一个解 。
3.2 非完备解
显而易见,x**2-9=0的解为3或者-3
def solve_function(unsolved_value):
x=unsolved_value[0]
return [
x**2-9,
]
solved=fsolve(solve_function,[0])
但是程序只能得出一个结果3,但是得不到-3
3.3 非线性方程的解
最简单的sin(x)=0.5,则x可能为π/6或者 5π/6
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
python解方程
"""
from scipy.optimize import fsolve
from math import sin,cos
def solve_function(unsolved_value):
x=unsolved_value[0]
return [
sin(x)-0.5
]
solved=fsolve(solve_function,[3.14])
print(solved)
solved=fsolve(solve_function,[0])
print(solved)
print("Program done!")
运行结果为:
[2.61799388]
[0.52359878]
Program done!
可以解出π/6或者 5π/6,中括号内为初始迭代的值 。
3.4 无法求解
部分较难情况无法求解
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
python解方程
"""
from scipy.optimize import fsolve
def solve_function(unsolved_value):
x,y=unsolved_value[0],unsolved_value[1]
return [
x*x 2*x*y,
2*x*y-2*y*y
]
solved=fsolve(solve_function,[6, -3])
print(solved)
print("Program done!")
无法求解会给出报错,和用最小二乘法迭代得到明显错误的解 。
[1.64526700e-115 1.33665018e-115]
A:\python\python\lib\site-packages\scipy\optimize\minpack.py:162: RuntimeWarning: The number of calls to function has reached maxfev = 600.
Program done!
warnings.warn(msg, RuntimeWarning)
四、sympy工具包求解
没安装可以在teiminal中pip install sympy , 此工具包涉及支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能 。功能较为强大 , 解方程组时性能也较好 。
4.1 二元一次方程组
较为简单,
from sympy import *
# 二元一次方程
x = Symbol('x')
y = Symbol('y')
solved_value=https://www.04ip.com/post/solve([2*x y-1, x-2*y], [x, y])
print(solved_value)
此方法较为简单,但是相应的自变量应当写成符号的形式,x=Symbol('x')
求解后有分数解:
{x: 2/5, y: 1/5}
Program done!
4.2 多解
多解情况与复数解
例如,多个解的情况,sympy可以很好的进行求解
x = Symbol('x')
solved_value=https://www.04ip.com/post/solve([x**2-9], [x])
print(solved_value)
输出结果:
[(-3,), (3,)]
4.3 复数解
复数解也可以很好解出:
# 复数解
solved_value = https://www.04ip.com/post/solve([x ** 29], [x])
print(solved_value)
solved_value = https://www.04ip.com/post/solve([x ** 4 - 9], [x])
print(solved_value)
"""
运行结果:
[(-3*I,), (3*I,)]
[(-sqrt(3),), (sqrt(3),), (-sqrt(3)*I,), (sqrt(3)*I,)]
"""
复数解也能较好解出
4.4 非线性求解
比如三角函数:
程序均能较好解出
# 非线性解
solved_value = https://www.04ip.com/post/solve([sin(x) - 0.5], [x])
print(solved_value)
solved_value = https://www.04ip.com/post/solve([sin(x) - 1], [x])
print(solved_value)
"""
[(0.523598775598299,), (2.61799387799149,)]
[(pi/2,)]
"""
4.5 较为复杂的二元二次方程
此题较难,无论人来算 , 很难算出,用scipy工具包也迭代不出解 。但是sympy强大的功能可以很好的解出此方程 。
# 二元二次方程组
x = Symbol('x')
y= Symbol('y')
solved_value=https://www.04ip.com/post/solve([x**2 2*x*y-6,2*x*y-2*y**2 3], [x,y])
print(solved_value)
有四组实数解:
[(-(-3sqrt(13))*sqrt(sqrt(13)/22), -sqrt(sqrt(13)/22)),
((-3sqrt(13))*sqrt(sqrt(13)/22), sqrt(sqrt(13)/22)),
(-sqrt(2 - sqrt(13)/2)*(-sqrt(13) - 3), -sqrt(2 - sqrt(13)/2)),
(sqrt(2 - sqrt(13)/2)*(-sqrt(13) - 3), sqrt(2 - sqrt(13)/2))]
复杂的问题终于解出,有四组实数解!
五、全部代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
python解方程
created by xingxinagrui on 2020.2.24
"""
from scipy.optimize import fsolve
from math import sin,cos
from sympy import *
# 1-4 scipy
# 5-7 sympy
part=7
if part==1:
# 求解非线性方程组
def solve_function(unsolved_value):
x=unsolved_value[0]
return [
sin(x)-0.5
]
solved=fsolve(solve_function,[3.14])
print(solved)
solved=fsolve(solve_function,[0])
print(solved)
if part==2:
# 求解三元二次方程组
def solve_function(unsolved_value):
x, y, z = unsolved_value[0], unsolved_value[1], unsolved_value[2]
return [
x ** 2y ** 2 - 10,
y ** 2z ** 2 - 34,
x ** 2z ** 2 - 26,
]
solved = fsolve(solve_function, [0, 0, 0])
print(solved)
if part==3:
#解的非完备性
def solve_function(unsolved_value):
x = unsolved_value[0]
return [
x ** 2 - 9,
]
solved = fsolve(solve_function, [0])
print(solved)
if part == 4:
# 较难无法求解
def solve_function(unsolved_value):
x, y = unsolved_value[0], unsolved_value[1]
return [
x * x2 * x * y,
2 * x * y - 2 * y * y
]
solved = fsolve(solve_function, [6, -3])
print(solved)
if part == 5:
# 二元一次方程
x = Symbol('x')
y = Symbol('y')
solved_value=https://www.04ip.com/post/solve([2*x y-1, x-2*y], [x, y])
print(solved_value)
if part == 6:
# 多解情况
x = Symbol('x')
solved_value=https://www.04ip.com/post/solve([x**2-9], [x])
print(solved_value)
# 复数解
solved_value = https://www.04ip.com/post/solve([x ** 29], [x])
print(solved_value)
solved_value = https://www.04ip.com/post/solve([x ** 4 - 9], [x])
print(solved_value)
# 非线性解
solved_value = https://www.04ip.com/post/solve([sin(x) - 0.5], [x])
print(solved_value)
solved_value = https://www.04ip.com/post/solve([sin(x) - 1], [x])
print(solved_value)
if part == 7:
# 二元二次方程组
x = Symbol('x')
y= Symbol('y')
solved_value=https://www.04ip.com/post/solve([x**2 2*x*y-6,2*x*y-2*y**2 3], [x,y])
print(solved_value)
print("Program done!")
用python如何得到一个方程的多个解方法/步骤
用Python解数学方程,需要用到Python的一个库——SymPy库 。
SymPy是符号数学的Python库,它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展 。
如果你的电脑上还没有安装sympy库,那就赶紧安装吧 , 安装命令:
pip3 install sympy
请点击输入图片描述
先来解一个简单点的方程吧 。
题目: 5x20 = 100
先直接上代码:
from sympy import *
x = Symbol('x')
print(solve([5*x20 - 100], [x]))
请点击输入图片描述
再来一个复杂点的二元一次方程吧 。
题目:3x4y =49, 8x- y = 14
代码如下:
from sympy import *
x = Symbol('x')
y = Symbol('y')
print(solve([3*x4*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)))
请点击输入图片描述
Python常用的正则表达式处理函数详解 正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便 。
在Python中,我们通过调用re库来使用re模块:
import re
下面介绍Python常用的正则表达式处理函数 。
re.match函数
re.match 函数从字符串的起始位置匹配正则表达式,返回match对象,如果不是起始位置匹配成功的话,match()就返回None 。
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式 。
string:待匹配的字符串 。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 。具体参数为:
re.I:忽略大小写 。
re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 。
re.M:多行模式 。
re.S:即 .,并且包括换行符在内的任意字符(. 不包括换行符) 。
re.U:表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 。
re.X:为了增加可读性,忽略空格和 # 后面的注释 。
import re#从起始位置匹配r1=re.match('abc','abcdefghi')print(r1)#不从起始位置匹配r2=re.match('def','abcdefghi')print(r2)
运行结果:
其中,span表示匹配成功的整个子串的索引 。
使用group(num) 或 groups() 匹配对象函数来获取匹配表达式 。
group(num):匹配的整个表达式的字符串,group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组 。
groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 。
import res='This is a demo'r1=re.match(r'(.*) is (.*)',s)r2=re.match(r'(.*) is (.*?)',s)print(r1.group())print(r1.group(1))print(r1.group(2))print(r1.groups())print()print(r2.group())print(r2.group(1))print(r2.group(2))print(r2.groups())
运行结果:
上述代码中的(.*)和(.*?)表示正则表达式的贪婪匹配与非贪婪匹配 。
re.search函数
re.search函数扫描整个字符串并返回第一个成功的匹配 , 如果匹配成功则返回match对象 , 否则返回None 。
re.search(pattern, string, flags=0)
pattern:匹配的正则表达式 。
string:待匹配的字符串 。
flags:标志位 , 用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 。
import re#从起始位置匹配r1=re.search('abc','abcdefghi')print(r1)#不从起始位置匹配r2=re.search('def','abcdefghi')print(r2)
运行结果:
使用group(num) 或 groups() 匹配对象函数来获取匹配表达式 。
group(num=0):匹配的整个表达式的字符串,group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组 。
groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 。
import res='This is a demo'r1=re.search(r'(.*) is (.*)',s)r2=re.search(r'(.*) is (.*?)',s)print(r1.group())print(r1.group(1))print(r1.group(2))print(r1.groups())print()print(r2.group())print(r2.group(1))print(r2.group(2))print(r2.groups())
运行结果:
从上面不难发现re.match与re.search的区别:re.match只匹配字符串的起始位置 , 只要起始位置不符合正则表达式就匹配失败,而re.search是匹配整个字符串 , 直到找到一个匹配为止 。
【函数用python解决 函数 python】re.compile 函数
compile 函数用于编译正则表达式 , 生成一个正则表达式对象,供 match() 和 search() 这两个函数使用 。
re.compile(pattern[, flags])
pattern:一个字符串形式的正则表达式 。
flags:可选 , 表示匹配模式 , 比如忽略大小写,多行模式等 。
import re#匹配数字r=re.compile(r'\d ')r1=r.match('This is a demo')r2=r.match('This is 111 and That is 222',0,27)r3=r.match('This is 111 and That is 222',8,27)print(r1)print(r2)print(r3)
运行结果:
findall函数
搜索字符串,以列表形式返回正则表达式匹配的所有子串,如果没有找到匹配的,则返回空列表 。
需要注意的是,match 和 search 是匹配一次 , 而findall 匹配所有 。
findall(string[, pos[, endpos]])
string:待匹配的字符串 。
pos:可选参数,指定字符串的起始位置,默认为0 。
endpos:可选参数 , 指定字符串的结束位置,默认为字符串的长度 。
import re#匹配数字r=re.compile(r'\d ')r1=r.findall('This is a demo')r2=r.findall('This is 111 and That is 222',0,11)r3=r.findall('This is 111 and That is 222',0,27)print(r1)print(r2)print(r3)
运行结果:
re.finditer函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回 。
re.finditer(pattern, string, flags=0)
pattern:匹配的正则表达式 。
string:待匹配的字符串 。
flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等 。
import rer=re.finditer(r'\d ','This is 111 and That is 222')for i in r:print (i.group())
运行结果:
re.split函数
将一个字符串按照正则表达式匹配的子串进行分割后,以列表形式返回 。
re.split(pattern, string[, maxsplit=0, flags=0])
pattern:匹配的正则表达式 。
string:待匹配的字符串 。
maxsplit:分割次数,maxsplit=1分割一次 , 默认为0,不限次数 。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写 , 多行匹配等 。
import rer1=re.split('\W ','This is 111 and That is 222')r2=re.split('\W ','This is 111 and That is 222',maxsplit=1)r3=re.split('\d ','This is 111 and That is 222')r4=re.split('\d ','This is 111 and That is 222',maxsplit=1)print(r1)print(r2)print(r3)print(r4)
运行结果:
re.sub函数
re.sub函数用于替换字符串中的匹配项 。
re.sub(pattern, repl, string, count=0, flags=0)
pattern:正则中的模式字符串 。
repl:替换的字符串 , 也可为一个函数 。
string:要被查找替换的原始字符串 。
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配 。
import rer='This is 111 and That is 222'# 删除字符串中的数字r1=re.sub(r'\d ','',r)print(r1)# 删除非数字的字符串r2=re.sub(r'\D','',r)print(r2)
运行结果:
到此这篇关于Python常用的正则表达式处理函数详解的文章就介绍到这了,希望大家以后多多支持!
用python来解决列表函数多次使用问题?你的函数是让原列表每个元素值 1 , 这里省略了函数,做的仍然是每个元素 1
# 2021-05-11 Luke
s=[1, 2, 3, 4, 5, 5, 6, 1, 4, 5, 5, 7, 1, 5, 3, 8, 3, 5, 9, 1]
num = input("请指定需要循环的次数:")
i = 1
while i = int(num):
new_s = []
for a in s:
a= 1
new_s.append(a)
s = []
s = new_s
用你写的函数的话这样也可以
# 2021-05-11 Luke
s=[1, 2, 3, 4, 5, 5, 6, 1, 4, 5, 5, 7, 1, 5, 3, 8, 3, 5, 9, 1]
def tset(s):
s1 = [x 1 for x in s]
return s1
num = input("请指定需要循环的次数:")
i = 1
while i = int(num):
new_s = tset(s)
s = new_s
i= 1
print(s)
i= 1
print(s)
Python 怎么用代码实现解"复杂的复合函数的值域"类型的数学题?解"复杂的复合函数的值域"类型的数学题可以使用 Python 中的函数来实现 。
首先函数用python解决,我们需要定义各个组成复合函数的子函数 。这些子函数可以使用 Python 中的 math 库来实现函数用python解决,也可以自己定义 。例如函数用python解决,我们定义一个复合函数 f(x) = cos(e^x)函数用python解决,那么我们可以定义子函数 f1(x) = e^x 和 f2(x) = cos(x) 。
然后,我们可以使用 Python 中的 lambda 函数来定义复合函数 f(x) = cos(e^x) 。lambda 函数是一种匿名函数,可以用来定义简单的函数 。例如 , 我们可以使用如下代码定义复合函数 f(x) = cos(e^x):
from math import exp, cos
f = lambda x: cos(exp(x))
最后,我们可以使用 Python 中的函数来计算复合函数的值域 。例如,我们可以使用如下代码来计算函数 f(x) = cos(e^x) 在 x = 1 时的值:
x = 1print(f(x))
注意,上述代码仅供参考,具体的实现可能会有所不同,要根据具体题目来设计代码 。
函数用python解决的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于函数 python、函数用python解决的信息别忘了在本站进行查找喔 。

    推荐阅读