Simpy简介:python仿真模拟库-03/5

一、说明

在过去的两篇文章中,我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在,让我们继续使用函数。

二、SymPy --- 函数类

SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数的基础,也充当未定义函数类的构造函数。

以下类别的函数继承自 Function 类 -

  • 复数函数
  • 三角函数
  • 整数函数
  • 组合函数
  • 其他杂项功能

三、复数函数

这组函数在sympy.functions.elementary.complexes模块中定义。

  re -- 该函数返回表达式的实部  
ba 复制代码
from sympy import * 
re(5+3*I)
ba 复制代码
Output:
5
ba 复制代码
re(I)
ba 复制代码
Output:
0
ba 复制代码
Im  --表达式的虚部
ba 复制代码
im(5+3*I)
ba 复制代码
Output:
3
ba 复制代码
im(I)
ba 复制代码
Output:
1
ba 复制代码
sign --表达式的符号

他的函数返回表达式的复数符号。

对于真实的表达,符号将是 -

  • 1 如果表达式为正
  • 如果表达式等于 0,则为 0
  • 如果表达式为负数,则为 -1

如果表达式是虚数,则返回的符号为 -

  • I 如果 im(表达式) 为正
  • -I 如果 im(表达式) 为负数
ba 复制代码
sign(1.55), sign(-1), sign(S.Zero)
ba 复制代码
Output:
(1, -1, 0)
ba 复制代码
sign (-3*I), sign(I*2)
ba 复制代码
Output:
(-I, I)
ba 复制代码
Abs

该函数计算复数的大小,测量复平面上从原点 (0,0) 到点 (a, b) 的距离。它是 abs() 函数的扩展,允许符号输入。

ba 复制代码
Abs(2+3*I)
ba 复制代码
Output:
√13
  conjugate --  共轭

该函数返回复数的共轭。为了找到复共轭,我们改变虚部的符号。

ba 复制代码
conjugate(4+7*I)
ba 复制代码
Output:
4 - 7i

四、三角函数(Trigonometric functions)

SymPy 提供三角函数的定义,如正弦、余弦、正切及其反函数(asin、acos、atan),以计算以弧度表示的角度值。

ba 复制代码
sin(pi/2), cos(pi/4), tan(pi/6)
ba 复制代码
Output:
(1, sqrt(2)/2, sqrt(3)/3)
ba 复制代码
asin(1), acos(sqrt(2)/2), atan(sqrt(3)/3)
Output:
(pi/2, pi/4, pi/6)

五、整数函数

这是一组函数,旨在对整数执行各种操作。

  • 天花板****Ceiling

这是一个单变量函数,提供大于或等于其输入的最小整数值。处理复数时,向上运算分别应用于实部和虚部。

ba 复制代码
ceiling(pi), ceiling(Rational(20,3)), ceiling(2.6+3.3*I)
ba 复制代码
Output:
(4, 7, 3 + 4*I)

地面****floor

此函数提供小于或等于输入参数的最大整数的整数值。处理复数时,此函数独立确定实部和虚部的下限值。

ba 复制代码
floor(pi), floor(Rational(100,6)), floor(6.3-5.9*I)
ba 复制代码
Output:
(3, 16, 6 - 6*I)

压裂****frac

该函数表示 x 的小数部分。

ba 复制代码
frac(3.99), frac(Rational(10,3)), frac(10)
ba 复制代码
Output:
(0.990000000000000, 1/3, 0)

六、组合函数

组合学处理与有限或离散系统中的选择、排列和操作元素相关的数学问题。

阶乘

阶乘在组合数学中起着至关重要的作用,它决定了 n 个对象的排列。记为𝑥!并用作非负整数阶乘的实现。对于负整数,阶乘结果为复无穷大。

ba 复制代码
x=Symbol('x') 
factorial(x)
ba 复制代码
Output:
x!
ba 复制代码
factorial(5)
ba 复制代码
Output:
120
ba 复制代码
factorial(-1)
ba 复制代码
Output:
∞∽

七、二项式binomial

该函数表示我们可以从 n 个元素的集合中选择 k 个元素的方式数。

ba 复制代码
x,y=symbols('x y') 
binomial(x,y)
ba 复制代码
Output:
(x/y)
ba 复制代码
binomial(4,2)
ba 复制代码
Output:
6
ba 复制代码
Rows of Pascal's triangle can be generated with the binomial function.
ba 复制代码
for i in range(5): print ([binomial(i,j) for j in range(i+1)])
ba 复制代码
Output:
[1]
ba 复制代码
[  1, 1  ] 
ba 复制代码
[1, 2, 1]
ba 复制代码
[1, 3, 3, 1]
ba 复制代码
[1, 4, 6, 4, 1]

斐波那契

斐波那契数列以 F0=0 和 F1=1 开始,后续的每一项都通过添加前面的两项来确定 (Fn=Fn−1+Fn−2)。

ba 复制代码
[fibonacci(x) for x in range(10)]
ba 复制代码
Output:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

tribonacci
Tribonacci 数形成一个整数序列,从 F0=0、F1=1、F2=1 开始,后续的每一项都是前面三项的和 (Fn=Fn-1+Fn-2+Fn-3) 。

ba 复制代码
tribonacci(5, Symbol('x'))
ba 复制代码
Output:
x^8+3x^5+3x^2
ba 复制代码
[tribonacci(x) for x in range(10)]
ba 复制代码
Output:
[0, 1, 1, 2, 4, 7, 13, 24, 44, 81]

八、杂项功能

以下是一些常用功能的汇总:

  1. Min:此函数提供列表中的最小值。它被命名为"Min"是为了防止与内置函数"min"发生冲突。
  2. Max:当您需要列表中的最大值时,"Max"函数可以满足您的需求,旨在避免与内置"max"函数发生冲突。
  3. root:"root"函数用于获取给定数字 x 的 n 次方根。
  4. sqrt:如果您对数字的主平方根感兴趣,可以使用"sqrt"函数。
  5. cbrt:"cbrt"函数计算数字的主立方根,这是 x++Rational(1,3) 的便捷快捷方式。

现在,让我们看一些示例,说明这些杂项函数的用法及其相应的结果。

ba 复制代码
Min(pi,E)
ba 复制代码
Output:
e
ba 复制代码
Max(5, Rational(11,2))
ba 复制代码
Output:
11/2
ba 复制代码
root(7,Rational(1,2))
ba 复制代码
Output:
49
ba 复制代码
sqrt(2)
ba 复制代码
Output:
√2
ba 复制代码
cbrt(1000)
ba 复制代码
Output:
10

九、SymPy --- 四元数

在数学领域,四元数系统是比复数更广泛的框架。在每个四元数实体中,存在四个标量变量,包含一个真实维度和三个虚构维度。

四元数由以下表达式表示:

q = a + bi + cj + dk

在此表达式中,"a"、"b"、"c"和"d"都是实数值,而"i"、"j"和"k"表示四元数单位。值得注意的是,这些单位满足以下关系:i² = j² = k² = ijk。

四元数类可以在 sympy.algebras.quaternion 模块中找到。

ba 复制代码
from sympy.algebras.quaternion import Quaternion 
q=Quaternion(2,3,1,4) 
q
ba 复制代码
Output:
2+3i+1j+4k

四元数用于纯数学,也用于应用数学、计算机图形学、计算机视觉等。

ba 复制代码
from sympy import * 
x=Symbol('x') 
q1=Quaternion(x**2, x**3, x)
q1
ba 复制代码
Output:
x^2+x^3i+xj+0k

四元数对象也可以有虚数系数

ba 复制代码
q2=Quaternion(2,(3+2*I), x**2, 3.5*I) 
q2
ba 复制代码
Output:
2+(3+2i)i+x2j+3.5ik

十、添加 add()

Quaternion 类中提供的此方法执行两个 Quaternion 对象的加法。

ba 复制代码
q1=Quaternion(1,2,3,4) 
q2=Quaternion(4,3,2,1) 
q1.add(q2)
ba 复制代码
Output:
5+5i+5j+5k

可以在四元数对象中添加数字或符号。

ba 复制代码
q1+2
ba 复制代码
Output:
3+2i+3j+4k
ba 复制代码
q1+x
ba 复制代码
Output:
(x+1)+2i+3j+4k

十一、乘法mul()

此方法执行两个四元数对象的乘法。

ba 复制代码
q1=Quaternion(1,2,1,2) 
q2=Quaternion(2,4,3,1) 
q1.mul(q2)
ba 复制代码
Output:
(−11)+3i+11j+7k

十二、逆inverse()

此方法返回四元数对象的逆。

ba 复制代码
q1.inverse()
ba 复制代码
Output:
1/10+(−1/5)i+(−1/10)j+(−1/5)k

十三、pow()

此方法返回四元数对象的幂。

ba 复制代码
q1.pow(2)
ba 复制代码
Output:
(−8)+4i+2j+4k

十四、指数exp()

此方法计算四元数对象的指数,即 eq

ba 复制代码
q=Quaternion(1,2,4,3) 
q.exp()

十五、SymPy --- 求解器 Solvers

由于Python的符号=和==作为赋值运算符和相等运算符具有特定含义,因此它们不适合表达符号方程。为了创建符号方程,SymPy 提供了 Eq() 函数作为专用工具。

ba 复制代码
from sympy import * 
x,y=symbols('x y') 
Eq(x,y)
ba 复制代码
Output:
x = y
ba 复制代码
Since x=y is possible if and only if x-y=0, above equation can be written as −
ba 复制代码
Eq(x-y,0)
ba 复制代码
Output:
x − y = 0

SymPy 中的求解器模块提供了 soveset() 函数,其原型如下 -

ba 复制代码
solveset(equation, variable, domain)

默认情况下,域为 S.Complexes。使用solvet()函数,我们可以求解代数方程如下 -

ba 复制代码
solveset(Eq(x**2-9,0), x)
ba 复制代码
Output:
{−3, 3}
ba 复制代码
solveset(Eq(x**2-3*x, -2),x)
ba 复制代码
Output:
{1,2}

Solveset 的输出是解的有限集。如果没有解决方案,则返回 EmptySet

ba 复制代码
solveset(exp(x),x)
ba 复制代码
Output:
∅

十六、线性方程

我们必须使用 linsolve() 函数来求解线性方程。

例如,方程如下 -

xy=4

x+y=1

ba 复制代码
from sympy import * 
x,y=symbols('x y') 
linsolve([Eq(x-y,4),Eq( x + y ,1) ], (x, y))
ba 复制代码
Output:
{(5/2,−3/2)}

linsolve() 函数还可以求解以矩阵形式表示的线性方程。

ba 复制代码
a,b=symbols('a b') 
a=Matrix([[1,-1],[1,1]]) 
b=Matrix([4,1]) 
linsolve([a,b], (x,y))
ba 复制代码
Output:
{(5/2,−3/2)}

十六、非线性方程

为此,我们使用 nonlinsolve() 函数。这个例子的方程 -

a2+a=0 ab=0

ba 复制代码
a,b=symbols('a b') 
nonlinsolve([a**2 + a, a - b], [a, b])
ba 复制代码
Output:
{(−1,−1),(0,0)}

十七、微分方程

首先,通过将 cls=Function 传递给符号函数来创建一个未定义的函数。要求解微分方程,请使用 dsolve。

ba 复制代码
x=Symbol('x') 
f=symbols('f', cls=Function) 
f(x)
ba 复制代码
Output:
f(x)
ba 复制代码
Here f(x) is an unevaluated function. Its derivative is as follows −
ba 复制代码
f(x).diff(x)
ba 复制代码
Output:
d/dxf(x)
ba 复制代码
We first create Eq object corresponding to following differential equation
ba 复制代码
eqn=Eq(f(x).diff(x)-f(x), sin(x)) 
eqn
ba 复制代码
Output:
−f(x)+d/dxf(x)=sin(x)
ba 复制代码
dsolve(eqn, f(x))

所以就是这样。这些函数是重要的构建块,构成模拟复杂数学情况的重要组成部分。

相关推荐
IT学长编程7 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
HEX9CF10 分钟前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
凌云行者23 分钟前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
IT学长编程24 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
希望有朝一日能如愿以偿26 分钟前
力扣题解(飞机座位分配概率)
算法·leetcode·职场和发展
小小娥子29 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
几何心凉36 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
丶Darling.37 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
华农第一蒟蒻39 分钟前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
积水成江40 分钟前
关于Generator,async 和 await的介绍
前端·javascript·vue.js