2024年Python最全使用Python求解方程_python解方程,2024年最新面试高分实战

简介: 2024年Python最全使用Python求解方程_python解方程,2024年最新面试高分实战

已剪辑自: https://zhuanlan.zhihu.com/p/24893371

新年第一篇,搞起.

这回写一个好久之前想做,一直搁着没做的东西—— Python 解方程(其实是放假回家,趁着家里电脑重装 LOL 的时间过来写一篇). 咱这回用三种不同的方法,来应对平常碰到的简单方程.

Numpy 求解线性方程组

例如我们要解一个这样的二元一次方程组:

x + 2y = 3
4x + 5y = 6

当然我们可以手动写出解析解,然后写一个函数来求解,这实际上只是用 Python 来单纯做“数值计算”. 但实际上,numpy.linalg.solve 可以直接求解线性方程组.

一般地,我们设解线性方程组形如 Ax=b,其中 A 是系数矩阵,b 是一维(n 维也可以,这个下面会提到),x 是未知变量. 再拿上面地最简单的二元一次方程组为例,我们用 numpy.linalg.solve 可以这样写:

In [1]: import numpy as np
   ...: A = np.mat('1,2; 4,5')    # 构造系数矩阵 A
   ...: b = np.mat('3,6').T       # 构造转置矩阵 b (这里必须为列向量)
   ...: r = np.linalg.solve(A,b)  # 调用 solve 函数求解
   ...: print r
   ...:
Out[1]: [[-1.]
         [ 2.]]

那么前面提到的“ n 维”情形是什么呢?实际上就是同时求解多组形式相同的二元一次方程组,例如我们想同时求解这样两组:

x + 2y = 3
4x + 5y = 6

x + 2y = 7
4x + 5y = 8

就可以这样写:

In [2]: import numpy as np
   ...: A = np.mat('1,2; 4,5')          # 构造系数矩阵 A
   ...: b = np.array([[3,6], [7,8]]).T  # 构造转置矩阵 b (这里必须为列向量),
   ...: 注意这里用的是 array
   ...: r = np.linalg.solve(A,b)        # 调用 solve 函数求解
   ...: print r
   ...:
Out[2]: [[-1.         -6.33333333]
         [ 2.          6.66666667]]

SciPy 求解非线性方程组

先看官方文档的介绍:

scipy.optimize.fsolve(func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-08, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)[source]

一般来说,我们只需要用到 func 和 x0 就够了. func 是自己构造的函数,也就是需要求解的方程组的左端(右端为 0),而 x0 则是给定的初值.

我们来看一个具体的例子,求解:

x + 2y + 3z - 6 = 0
5 \* (x \*\* 2) + 6 \* (y \*\* 2) + 7 \* (z \*\* 2) - 18 = 0
9 \* (x \*\* 3) + 10 \* (y \*\* 3) + 11 \* (z \*\* 3) - 30 = 0

就可以这么写:

In [3]: from scipy.optimize import fsolve
   ...:
   ...: def func(i):
   ...:     x, y, z = i[0], i[1], i[2]
   ...:     return [
   ...:             x + 2 \* y + 3 \* z - 6,
   ...:             5 \* (x \*\* 2) + 6 \* (y \*\* 2) + 7 \* (z \*\* 2) - 18,
   ...:             9 \* (x \*\* 3) + 10 \* (y \*\* 3) + 11 \* (z \*\* 3) - 30
   ...:            ]
   ...:
   ...: r = fsolve(func,[0, 0, 0])
   ...: print r
   ...:
Out[3]: [ 1.00000001  0.99999998  1.00000001]

当然,SciPy 也可以用来求解线性方程组,这是因为 scipy.optimize.fsolve 本质上是最小二乘法来逼近真实结果.

SymPy 通吃一切

例如求解一个:

x + 2 * (x ** 2) + 3 * (x ** 3) - 6 = 0

直接就是:

In [4]: from sympy import \*
   ...: x = symbols('x')
   ...: solve(x + 2 \* (x \*\* 2) + 3 \* (x \*\* 3) - 6, x)
Out[4]: [1, -5/6 - sqrt(47)\*I/6, -5/6 + sqrt(47)\*I/6]

另外,

@Wayne Shi

的这篇 使用 Python 解数学方程 ,就重点讲述了 SymPy 解线性方程组的方法,所以我也就不再赘述了。

其实 SymPy 能干的太多了,有兴趣的可以看一看 GitHub上的 Quick examples.



SymPy简介

SymPy的官方教程:

https://github.com/sympy/sympy/wiki/Quick-examples

https://docs.sympy.org/latest/tutorial/index.html

已剪辑自: https://blog.csdn.net/starter_____/article/details/81989835

SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。

In [1]:from sympy import *
In [2]:x = Symbol('x')
In [3]:y = Symbol('y')123
展开与折叠

expand( )展开方程

In [8]: ((x+y)**2).expand()
Out[8]: x**2 + 2*x*y + y**212

facrot( )折叠方程

In [13]: factor(x**2 + 2*x*y + y**2)
Out[13]: (x + y)**212
分离与合并

apart( )分离整式

In [14]: together(1 + 2/(x - 1))
Out[14]: (x + 1)/(x - 1)12

together( )合并整式

In [10]: together(1/x+1/y+1/z)
Out[10]: (x*y + x*z + y*z)/(x*y*z)12
简化表达式

simplify( )普通的化简

In [15]: simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
Out[15]: x - 112

trigsimp( )三角化简

In [18]: trigsimp(sin(x)/cos(x))
Out[18]: tan(x)12

powsimp( )指数化简

In [21]: powsimp(x**a*x**b)
Out[21]: x**(a + b)12
solve( )解方程

第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数

一元一次方程

In [7]:solve(x * 3 - 6, x)
[2]12

二元一次方程

In [8]: solve([2 * x - y - 3, 3 * x + y - 7],[x, y])
Out[8]: {x: 2, y: 1}12
limit( )求极限

dir=’+’表示求解右极限,dir=’-‘表示求解左极限

In [10]: limit(1/x,x,oo,dir='+')
Out[10]: 0
In [11]: limit(1/x,x,oo,dir='-')
Out[11]: 01234
integrate( )求积分

不定积分

In [12]: integrate(sin(x),x)
Out[12]: -cos(x)12

定积分

In [13]: integrate(sin(x),(x,0,pi/2))
Out[13]: 112
diff( )求导
In [14]: diff(x**3,x)
Out[14]: 3*x**2
In [15]: diff(x**3,x,2)
Out[15]: 6*x12345
dsolve( )解微分方程

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试宝典

简历模板


相关文章
|
1天前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
102 66
|
1天前
|
SQL 数据采集 数据可视化
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
102 64
|
1天前
|
机器学习/深度学习 数据挖掘 开发者
探索Python编程:从基础到实战
【9月更文挑战第34天】在这篇文章中,我们将一起踏上Python编程的旅程。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基础语法开始,逐步深入到更复杂的主题,如面向对象编程和网络应用开发。我们还将探讨如何在实际项目中应用这些知识,以及如何通过持续学习和实践来提高你的编程技能。让我们一起探索Python的世界,发现它的无限可能!
|
5天前
|
调度 开发者 UED
探索Python中的异步编程:从基础到实战
【9月更文挑战第30天】在编程的世界里,异步编程是一个强大的概念,它允许程序在等待某些操作完成时继续执行其他任务。本文将深入探讨Python中的异步编程,从理解其基本概念开始,逐步过渡到高级应用。我们将通过具体的代码示例来展示如何在实际项目中实现异步功能,从而提高应用程序的性能和响应性。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
3天前
|
存储 数据处理 开发者
深入浅出:Python编程基础与实战技巧
【9月更文挑战第32天】本文将引导读者从零开始,掌握Python编程语言的核心概念,并通过实际代码示例深入理解。我们将逐步探索变量、数据结构、控制流、函数、类和异常处理等基本知识,并结合实用案例,如数据处理、文件操作和网络请求,提升编程技能。无论您是初学者还是有一定经验的开发者,这篇文章都能帮助您巩固基础,拓展视野。
|
3天前
|
设计模式 开发者 Python
探索Python中的异步编程:从基础到实战
【9月更文挑战第32天】在Python的世界中,异步编程是一种让程序在等待任务完成时不阻塞的技术。本文将通过浅显易懂的方式,带领读者了解异步编程的核心概念、常用库及其在实际项目中的应用。我们将从异步IO的基础知识出发,逐步深入到asyncio库的使用,最后通过一个简易Web服务器的示例,演示如何将理论应用到实践中。文章旨在为初学者提供一个清晰的学习路径,帮助他们掌握Python异步编程的精髓。
|
8天前
|
数据采集 人工智能 程序员
探索Python编程:从基础到实战
【9月更文挑战第27天】在这篇文章中,我们将一起踏上一段激动人心的Python编程之旅。无论你是初学者还是有一定经验的开发者,这里都有适合你的内容。文章将通过浅显易懂的语言带你了解Python的基础语法,并通过实际案例展示如何将这些知识应用于解决现实问题。准备好,我们即将启程!
|
Python
python求解一元二次方程
python求解一元二次方程
171 0
|
1天前
|
机器学习/深度学习 Linux Python
Python编程教学
Python教学
24 13
|
2天前
|
机器学习/深度学习 人工智能 数据可视化
Python比较适合哪些场景的编程?
Python比较适合哪些场景的编程?
14 7
下一篇
无影云桌面