使用Python求解方程

2023-05-16

文章目录

    • **Numpy 求解线性方程组**
    • **SciPy 求解非线性方程组**
    • SymPy 通吃一切
    • SymPy简介
      • 展开与折叠
      • 分离与合并
      • 简化表达式
      • solve( )解方程
      • limit( )求极限
      • integrate( )求积分
      • diff( )求导
      • dsolve( )解微分方程
      • 矩阵化简
    • 目录
    • 前言
    • (一)求解多元一次方程-solve()
      • 1.说明:
      • 2.源代码:
      • 3.输出:
    • (二)解线性方程组-linsolve()
      • 1.说明:
      • 2.源代码:
      • 3.输出:
    • (三)解非线性方程组-nonlinsolve()
      • 1.说明:
      • 2.源代码:
      • 3.输出:
    • (四)求解微分方程-dsolve()
      • 1.说明:
      • 2.源代码:
      • 3.输出:

已剪辑自: 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( )解微分方程

以 y′=2xy 为例

In [17]: f =Function('f')
In [18]: dsolve(diff(f(x),x) - 2*f(x)*x,f(x))
Out[18]: Eq(f(x), C1*exp(x**2))123

矩阵化简

In [19]:x1,x2,x3 = symbols('x1 x2 x3')
In [20]:a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
In [21]:m = Matrix([[x1, x2, x3]])
In [22]:n = Matrix([[a11, a12, a13], [a12, a22, a23], [a13, a23, a33]])
In [23]:v = Matrix([[x1], [x2], [x3]])
In [24]:f = m * n * v
In [25]:f[0].subs({x1:1, x2:1, x3:1})

Out[26]:Matrix([[x1*(a11*x1 + a12*x2 + a13*x3) + x2*(a12*x1 + a22*x2 + a23*x3) + x3*(a13*x1 + a23*x2 + a33*x3)]])
Out[27]:a11 + 2*a12 + 2*a13 + a22 + 2*a23 + a33
1234567891011


已剪辑自: https://www.cnblogs.com/zyg123/p/10549354.html

目录

前言

(一)求解多元一次方程-solve()

1.说明:

解多元一次方程可以使用solve(),在sympy里,等式是用Eq()来表示,

例如:2x=4 表示为:Eq(x*2, 4)

2.源代码:

"""
 解下列二元一次方程
  2x-y=3
  3x+y=7
"""
# 导入模块
from sympy import *

# 将变量符号化
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')

# 解一元一次方程
expr1 = x*2-4
r1 = solve(expr1, x)
r1_eq = solve(Eq(x*2, 4), x)
print("r1:", r1)
print("r1_eq:", r1_eq)

# 解二元一次方程
expr2 = [2*x-y-3, 3*x+y-7]
r2 = solve(expr2, [x, y])
print("r1:", r2)

# 解三元一次方程
f1 = x+y+z-2
f2 = 2*x-y+z+1
f3 = x+2*y+2*z-3
r3 = solve([f1, f2, f3], [x, y, z])
print("r3:", r3)

3.输出:

01.png

(二)解线性方程组-linsolve()

1.说明:

在sympy中,解线性方程组有三种形式:

  1. 默认等式为0的形式:linsolve(eq, [x, y, z])
  2. 矩阵形式:linsolve(eq, [x, y, z])
  3. 增广矩阵形式:linsolve(A,b, x, y, z)

2.源代码:

"""
    x+y+z-2=0
    2x-y+z+1=0
    x+2y+2z-3=0
"""
from sympy import *


x, y, z = symbols("x y z")

# 默认等式为0的形式
print("======默认等式为0的形式 =======")
eq = [x+y+z-2, 2*x-y+z+1, x+2*y+2*z-3]
result = linsolve(eq, [x, y, z])
print(result)
print(latex(result))

# 矩阵形式
print("======矩阵形式 =======")
eq = Matrix(([1, 1, 1, 2], [2, -1, 1, -1], [1, 2, 2, 3]))
result = linsolve(eq, [x, y, z])
print(result)
print(latex(result))

# 增广矩阵形式
print("======增广矩阵形式 =======")
A = Matrix([[1, 1, 1], [2, -1, 1], [1, 2, 2]])
b = Matrix([[2], [-1], [3]])
system = A, b
result = linsolve(system, x, y, z)
print(result)
print(latex(result))

3.输出:

02.png

(三)解非线性方程组-nonlinsolve()

1.说明:

nonlinsolve()用于求解非线性方程组,例如二次方,三角函数,,,等方程

2.源代码:

"""
    x**2+y**2-2=0
    x**3+y**3=0
"""

import sympy as sy
x, y = sy.symbols("x y")

eq = [x**2+y**3-2, x**3+y**3]
result = sy.nonlinsolve(eq, [x, y])
print(result)
print(sy.latex(result))

3.输出:

{(−1,1),(−1,−12−3i2),(−1,−12+3i2),(1−i,−1+i),(1+i,−1−i),(1−i−63+122−i−23+42,12+32+2−2+32),(1−−12−632+−4−232,−32+12−−8+(−3+1)22),(1−−4−232+−12−632,−32+12+−8+(−3+1)22),(1+−4+232+−12+632,12+32−2−2+32)}

03.png

(四)求解微分方程-dsolve()

1.说明:

求解微分方程使用dsolve(),注意:

f = symbols(‘f’, cls=Function)的作用是声明f()是一个函数。

2.源代码:

from sympy import *


# 初始化
x = symbols('x')
f = symbols('f', cls=Function)

# 表达式
expr1 = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))

# 求解微分方程
r1 = dsolve(expr1, f(x))

print(r1)
print("原式:", latex(expr1))
print("求解后:", latex(r1))

3.输出:

原式:

f(x)−2ddxf(x)+d2dx2f(x)=sin⁡(x)

解微分后:

f(x)=(C1+C2x)ex+cos⁡(x)2

04.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Python求解方程 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 任总与系统工程领域科学家、专家会谈纪要

    任总与系统工程领域科学家 专家会谈纪要 2022年5月29日 一 系统工程不仅是理论 方法和实践 xff0c 更是开放的思想和哲学 我们要利用系统工程的思想 xff0c 把公司内的 围墙 炸开 xff0c 摧毁各种 土围子 xff0c 打开
  • 系统工程基础

    本词条由 科普中国 科学百科词条编写与应用工作项目 审核 系统工程是为了最好地实现系统的目的 xff0c 对系统的组成要素 组织结构 信息流 控制机构等进行分析研究的科学方法 它运用各种组织管理技术 xff0c 使系统的整体与局部之间的关系
  • 使用多基站(三基站,四基站)来定位的求解方法

    使用三边定位算法进行室内定位 https github com Meihai IndoorPos 三点立体基站定位方法与装置
  • 简简单单的科研秘籍

    已剪辑自 https mp weixin qq com s gxPPg9NurvByWT GtxnjkQ 最近我在清华园做了一场题为 简简单单的科研秘籍 的工作坊 xff0c 跟同学们分享自己的科研心得 现整理成文 xff0c 以飨读者 一
  • C++都有哪些就业方向?是否应该学习C++?

    已剪辑自 https mp weixin qq com s Z L 8NQcJOYSteEYWj4A9Q 最近我经常会收到很多私信 xff0c 其中很大一部分都是关于C 43 43 就业的问题 比如C 43 43 就业都有哪些方向 xff1
  • 华为这份关于专利的会议纪要,都说了什么?(内含华为十大发明彩蛋)

    已剪辑自 https mp weixin qq com s nUP7hPDOQ hkeMAe3bu4mQ 6月8日 xff0c 华为在深圳召开 开拓创新视野 xff1a 2022创新和知识产权论坛 xff0c 并公布了在其两年一度的 十大发
  • B端产品经理基本工作流程

    产品岗位必备素质 产品是一个门槛较低的岗位 xff0c 是一个看起来很容易 xff0c 做起来各个地方都是bug的岗位 产品需要更多的是软实力 xff0c 把握产品的方向 xff0c 目标用户是谁 xff0c 场景是什么 xff0c 达到怎
  • 论文专利博客写作总结

    文章目录 一 背景二 文章类型1 从文体的角度来看2 从学术与否的角度来看3 从论文的角度来说 三 我关注的文体四 技术博客五 专利写作六 论文写作 一 背景 想要整理这篇文章的原因是一直对论文写作这些东西有种本能的躲避 xff0c 当然这
  • 如何写一篇科研论文

    文章目录 一 什么是科研论文二 科研论文的创作过程三 科研论文分为几部分 xff0c 每部分该这样写四 英文论文写作方法五 论文写作辅助工具 一 什么是科研论文 从研究领域来划分 xff0c 可分为社会科学论文和自然科学论文 社会科学论文
  • 树莓派(以及各种派)使用指南

    树莓派 xff08 以及各种派 xff09 使用指南 https zhuanlan zhihu com p 77585297
  • 为什么我们从 Python 切换到 Go

    文章目录 文章目录 原因 1 性能原因 2 语言表现很重要原因 3 开发人员的生产力和没有太有创意原因 4 并发和通道原因 5 快速编译时间理由 6 团队建设的能力理由 7 强大的生态系统原因 8 Gofmt xff0c 强制代码格式化原因
  • 第一性原理(最优解理论)

    已剪辑自 https blog csdn net zhiyuan2021 article details 123263836 第一性原理 的思考方式 xff0c 是用物理学的角度看待世界 xff0c 也就是说一层层拨开事物表象 xff0c
  • 被奉为经典的「金字塔原理」,教给我们哪些PPT写作技巧?

    已剪辑自 https mp weixin qq com s biz 61 MzU2ODEyNzY3Mw 61 61 amp mid 61 2247486116 amp idx 61 1 amp sn 61 4b4ccdaecc3fc3370
  • PPT演讲能力阅读笔记

    内 容 提 要 在工作中 xff0c 我们不仅要有实力 xff0c 还要善于展示自己的实力 xff0c 所以在人生的重要时刻 xff0c 不能输在表达上 本书以PPT演讲大树法则的五个维度为基础 xff0c 针对工作汇报 求职面试 销售演示
  • 即兴演讲、怎么锻炼即兴演讲能力、一些即兴演讲的模板

    文章目录 应有素质准备方法模糊性临场性 组合形式并列式正反式递进式 基本技巧举例说明 一 散 点 联 想 法 二 问题 原因 解决方案 三 感谢 回顾 愿景 四 观 音 按 揭 法 五 黄 金 三 点 法 六 总 结 1 五个名称 锻炼你的
  • 演讲的能力

    文章目录 主要形式照读式演讲背诵式演讲提纲式演讲即兴式演讲 提高方法研究对象注意事项语言艺术名言 一 每天三分钟微信语音练习 二 会演讲从写作开始 xff0c 理清思路 xff0c 结构化表达 三 提升内涵 xff0c 让自己有东西可讲 四
  • 专利常见问题汇总

    文章目录 Q1 xff1a 我是职场新人 xff0c 试用期间适合写专利么 xff1f Q2 xff1a 我的第一个专利 xff0c 应该写什么 xff1f Q3 xff1a 撰写专利的 xff0c 有什么优点 xff1f Q4 xff1a
  • 产品设计中关于思考力那些事

    这周的面试 xff0c 对我自己来说 xff0c 更像是一种迭代反思 从做什么怎么做 xff0c 到为什么做 xff0c 的一种强制思考 一方面是入行时间短 xff0c 另一方面是公司产品业务主导 xff0c 相对不需要产品去思考 xff0
  • 【优秀专利】张小龙 | 我在元宇宙里也能收到微信

    已剪辑自 https mp weixin qq com s mOIqPH7hD6ysijJTtV8w9g 引言 前段时间 xff0c 去腾讯参观的时候 xff0c 和一个朋友聊起张小龙 xff0c 他说了一个特别有意思的事情 话说腾讯有一个
  • 使用Python求解方程

    文章目录 Numpy 求解线性方程组 SciPy 求解非线性方程组 SymPy 通吃一切SymPy简介展开与折叠分离与合并简化表达式solve 解方程limit 求极限integrate 求积分diff 求导dsolve 解微分方程矩阵化简