sympy常用函数与错误笔记

embedded/2025/1/18 4:16:29/

文章目录

  • 前言
  • 一、sympy基本函数介绍
    • 变量定义
      • 1. sp.Symbol("x") 或 sp.symbols("m n")
      • 2. sp.Function("y")
      • 3. func(x).diff(x, n)
    • 定义方程与求解符号
      • 1. sp.Eq(lhs, rhs)
      • 2. 求解函数(*代表了常用且重要,其他部分作为拓展,可以有需要的时候再查询使用)
      • 3. func.subs(a, b) 或者 func.subs({a: b})
      • 4. func.evalf(subs, n)
  • 二、 常见错误(持续更新)
    • TypeError: cannot create mpf from x
    • TypeError: 'Equality' object is not subscriptable
  • 三、计算模板


前言

本文将针对常用的函数进行用途分析与介绍,对代码过程中可能会遇到的报错进行分析,并给出实例帮助理解代码。文章较长,可以针对感兴趣的部分进行跳转


一、sympy基本函数介绍

变量定义

1. sp.Symbol(“x”) 或 sp.symbols(“m n”)

这是定义变量,如f(x)中的x就是使用Symbol定义的
使用Symbol只能定义一个变量, 想要一次性定义多个变量,需要使用symbols,不同的变量之间用空格间隔

2. sp.Function(“y”)

定义函数,相当于f(x)中的f,这时候程序没法判断它是谁的函数,需要显式的定义指定函数的变量,如f(x)

3. func(x).diff(x, n)

定义函数关于x的n阶导数
在求解过程中尽量都采用diff方法,而非使用Derivative()函数

定义方程与求解符号

1. sp.Eq(lhs, rhs)

lhs, rhs 分别代表了等式左边与等式右边公式
例如y = x就需要表示为sp.Eq(y(x), x)
tip: 如果不是y(x),在求解这个等式的时候会报错哦,一定要记得定义它是谁的函数

2. 求解函数(*代表了常用且重要,其他部分作为拓展,可以有需要的时候再查询使用)

函数名称用途主要参数说明示例
solve解普通方程的解析解f(方程或方程组)
symbols(求解的变量)
多个变量或方程需要用 [] 框起来
通用函数,用于解一元或多元代数方程或方程组。solve(x**2 - 4, x) # 相当于求解 x 2 − 4 = 0 x^2 - 4 = 0 x24=0
# [ -2, 2 ]
nsolve解普通方程数值解f
x(待求解变量)
x0(初始猜测值,与结果有关)
用于求方程的数值解,需要输入初始猜测值,并寻找该猜测值附近的数值解。通常返回一个近似解,也可使用 .evalf() 方法进行数值化。nsolve(sin(x) - 0.5, 0)
# 因为是从0为初始值,求解 s i n ( x ) = 0.5 sin(x) = 0.5 sin(x)=0.5 最近的答案,所以应该是 π 6 \frac{\pi}{6} 6π约等于0.5236
# 返回的结果是数值解
dsolve解微分方程eq(方程)
func(求解的函数,如 f(x)
ics(初始条件,可选)
用于求解一阶或高阶常微分方程的解析解,支持线性和非线性方程。传入 ics,可以直接算出微分方程中的常数。x = symbols(‘x’)
f = Function(‘f’)(x)
ode = Eq(diff(f, x), f) # 求解最常规的微分方程 f ′ ( x ) = f ( x ) f'(x) = f(x) f(x)=f(x)
dsolve(ode, f) # [Eq( f ( x ) , C 1 ∗ e x f(x), C1* e^x f(x),C1ex)]
pdsolve解偏微分方程 (复杂一些时无法直接求解)eq
func
专门用于求解偏微分方程的解析解,通常需要配合分离变量法。当直接输入的偏微分方程过于复杂时,先进行变量分离再尝试求解# 一般使用方法类似 dsolve,但处理偏微分方程时
# pdsolve(eq, func)
linsolve解线性方程组 (符号解)system
symbols
适合求解线性方程组,返回向量形式的解。x, y = symbols(‘x y’)
system = [x + y - 2, x - y - 0]
linsolve(system, [x, y]) # 求解一个简单的线性方程组,记住system里的式子右侧都是0
# { (1, 1) }
nonlinsolve解非线性方程组 (符号解)system
symbols
用于求解非线性方程组,返回集合形式的符号解。x, y = symbols(‘x y’)
system = [ x 2 + y − 4 x^2 + y - 4 x2+y4, x − y 2 + 1 x - y^2 + 1 xy2+1]
nonlinsolve(system, [x, y])
solve_poly_system解多项式方程组 (多变量,符号解)system
symbols
用于解特定的多项式方程组。# 用法与 solve 类似,但主要针对多项式方程
# solve_poly_system([Eq(…)], [x, y])
solve_univariate_inequality解一元不等式ineq(不等式)
symbol(变量)
用于求解一元不等式,返回区间形式或逻辑表达式。x = Symbol(‘x’, real=True)
ineq = (x**2 < 4)
solve_univariate_inequality(ineq, x) # -2 < x < 2
reduce_inequalities简化或求解不等式组inequalities
symbols
简化复杂的不等式组,返回符号形式的解集。x = symbols(‘x’, real=True)
reduce_inequalities([[x > 1, x < 3]], [x]) # 1 < x < 3

3. func.subs(a, b) 或者 func.subs({a: b})

subs输入一个字典或者两个参数,可以将变量换成指定的值,如上式中的a替换为了b
例如:
对于微分方程中输出的结果中有C1,在已知某个初始值(如 y ( 0 ) = 1 2 y(0) = \frac{1}{2} y(0)=21)的情况下,对结果
r e s = E q ( y ( x ) = C 1 e − x + e x 2 ) res = Eq(y{\left(x \right)} = C_{1} e^{- x} + \frac{e^{x}}{2}) res=Eq(y(x)=C1ex+2ex)进行常数的求解

python">C1 = sp.Symbol("C1")  # 必须先定义C1是一个变量,才能作为nsolve中的实参进行求解
res = res.subs({y(x): 1/2, x: 0})  # 必须先替换y(x),再替换x
C = sp.nsolve(res, C1, 0)  # 这样就可以解得常数值

4. func.evalf(subs, n)

evalf是一个方法,是基于结果上的方法,可以计算某个表达式的具体值,也可以对nsolve的结果进行位数调整或者
例如:

python">(1 / a).evalf(subs={a: 2}, n=4)
# 结果为0.5000

二、 常见错误(持续更新)

TypeError: cannot create mpf from x

nsolve(f, x, x0), 这通常与nsolve中没有初始值有关,设置一个初始值就好了

TypeError: ‘Equality’ object is not subscriptable

因为dsolve解的的结果是一个列表,使用dsolve[0]获取的equality是不可用索引的
只能通过lhs和rhs分别获得等式左右两边的式子

三、计算模板

  1. 设置变量, 利用symbols和Function设定变量与函数
  2. 利用sp.Eq设置等式
  3. 使用对应的solve函数进行求解(如有初值注意初值条件带入)
  4. (可选)使用subs对求解的结果进行值代入,再使用nsolve对某些常量进行求解

例子 d y d x + y ( x ) = e x \frac{d y}{d x} + y{\left(x \right)} = e^{x} dxdy+y(x)=ex

python"># 1. 进行变量设置
y = sp.Function('y')
x = sp.symbols('x')
y_ = y(x).diff(x)  # 直接使用这个为一阶导数
# 2. 设置方程 
eq = sp.Eq(y_ + y(x), sp.exp(x))
# 3. 求解方程,因为是微分方程所以用dsolve
res = sp.dsolve(eq, y(x))
sp.pprint(res)# 4. 如果有初值
res = sp.dsolve(eq, y(x), ics={y(0):1}) # 使用ics(初始条件)可以直接求解常量
# 或对结果使用sub后利用nsolve求解

http://www.ppmy.cn/embedded/154847.html

相关文章

[译] Awesome Flutter:带你从入门到进阶的 Flutter 指南

Awesome Flutter&#xff08;中文版&#xff09;&#xff1a;github.com/xitu/awesom… Awesome Flutter&#xff08;英文版&#xff09;&#xff1a;github.com/Solido/awes… Flutter 是可以用一份代码来创建 iOS 和 Android 高性能、高保真应用的移动端 SDK。 如果你喜欢…

Linux nc 命令详解

简介 nc 全称 netcat&#xff0c;是一个在 Linux 中多功能的网络工具&#xff0c;通常用于通过 TCP 或 UDP 读取和写入网络连接&#xff0c;也能作为客户端或服务端用来 debug&#xff0c;测试&#xff0c;网络问题分析。 常用示例 检查端口是否是打开的 nc -zv <hostna…

算法专题——二分查找

目录 前言 1、二分查找 2、在排序数组中查找元素的第一个和最一个位置 3、搜索插入位置 4、 x 的平⽅根 5、山峰数组的峰顶 6、寻找峰值 ​ 前言 本文主要介绍二分算法的思想和相关题目。很多介绍都说二分算法往往需要有序&#xff0c;但实际有序并不是使用二分算法的核…

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思&#xff1f;和普通笔记本的优势在哪里&#xff1f; 在现代社会中&#xff0c;笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行业或环境中&#xff0c;普通笔记本电脑由于其脆弱性和对环境条件的敏感性&#xff0c;往…

Netty中的NioEventloop(1)

1. 基础介绍 1.1 Reactor模式概述 Reactor模式 是一种事件驱动的设计模式&#xff0c;广泛应用于高并发的网络编程中&#xff0c;尤其是在服务器端程序的实现中。这个模式的目标是 处理大量的并发请求&#xff0c;同时避免每个请求都被独立的线程所处理&#xff0c;以节省系统…

【Python】分析JVM的GC日志

在项目启动命令中增加JVM参数 nohup /usr/local/jdk1.8.0_361/bin/java -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintGCDateStamps -XX:PrintHeapAtGC -Xloggc:/usr/local/logs/gc.log -jar /opt/test.jar --spring.profiles.activeprod > /dev/null 2>&1…

使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose&#xff0c;如果没有&#xff0c;可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关&#xff0c;让所有的容器共用此网…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…