精华内容
下载资源
问答
  • sympy库
    千次阅读
    2020-11-30 09:44:07

    简介

    SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。(来自维基百科的描述)

    Sympy安装方法

    安装命令:pip install sympy

    基本数值类型

    实数,有理数和整数

    SymPy有三个内建的数值类型:实数,有理数和整数。有理数类用两个整数来表示一个有理数。分子与分母,所以Rational(1,2)代表1/2,Rational(5,2)代表5/2,等等。

    >>>from sympy import *

    >>>a = Rational(1,2)

    >>>a

    1/2

    >>>a*2

    1

    >>>Rational(2)**50/Rational(10)**50

    1/88817841970012523233890533447265625

    当利用Python的整数计算时要注意一下,Python只会截取除法的整数部分:

    >>>1/2

    0

    >>>1.0/2

    0.5

    然而你可以:

    >>>from __future__ import division

    >>>1/2 #doctest: +SKIP

    0.5

    正确的除法在python3k和isympy中这样做,是标准的。

    特殊的常数

    我们也可以有一些特殊的常数,像e和pi,它们会被当作符号去对待。(1+pi不会求得值,反而它会保持为1+pi),例如:

    >>>pi**2

    pi**2

    >>>pi.evalf()

    3.14159265358979

    >>>(pi+exp(1)).evalf()

    5.85987448204884

    求表达式的浮点数-evalf()函数

    正如你看到的,evalf()函数可以用求出表达式的浮点数。

    有一个无穷大的类型,被成为oo:

    >>>oo > 99999

    True

    >>>oo + 1

    oo

    If the substitution will be followed by numerical evaluation, it is better to pass the substitution to evalf as

    >>> (1/x).evalf(subs={x: 3.0}, n=21)

    0.333333333333333333333

    rather than

    >>> (1/x).subs({x: 3.0}).evalf(21)

    0.333333333333333314830

    Sympy基本使用

    定义变量-Symbols函数

    对比与其他的计算机代数系统,在SymPy中要明确声明符号变量:

    >>> x = symbols('x')

    >>> x + 1

    x + 1

    >>>x,y,z=symbols('x y z')

    >>> crazy = symbols('unrelated')

    >>> crazy + 1

    unrelated + 1

    >>> x = symbols('x')

    >>> expr = x + 1

    >>> x = 2

    >>> print(expr)

    x + 1

    Changing x to 2 had no effect on expr. This is because x = 2 changes the Python variable x to 2, but has no effect on the SymPy Symbol x, which was what we used in creating expr.

    变量替换subs函数

    >>> x = symbols('x')

    >>> expr = x + 1

    >>> expr.subs(x, 2)

    3

    >>> from sympy import pi, exp, limit, oo

    >>> from sympy.abc import x, y

    >>> (1 + x*y).subs(x, pi)

    pi*y + 1

    >>> (1 + x*y).subs({x:pi, y:2})

    1 + 2*pi

    >>> (1 + x*y).subs([(x, pi), (y, 2)])

    1 + 2*pi

    >>> reps = [(y, x**2), (x, 2)]

    >>> (x + y).subs(reps)

    6

    >>> (x + y).subs(reversed(reps))

    x**2 + 2

    >>> (x**2 + x**4).subs(x**2, y)

    y**2 + y

    >>> (x**2 + x**4).xreplace({x**2: y})

    x**4 + y

    >>> (x/y).subs([(x, 0), (y, 0)])

    0

    >>> (x/y).subs([(x, 0), (y, 0)], simultaneous=True)

    nan

    >>> ((x + y)/y).subs({x + y: y, y: x + y})

    1

    >>> ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)

    y/(x + y)

    >>> limit(x**3 - 3*x, x, oo)

    oo

    调用方式:[subs(*args, **kwargs)]

    代数

    局部的代数式展开,使用apart(expr, x):

    In [1]: 1/( (x+2)*(x+1) )

    Out[1]:

    1

    ───────────────

    (2 + x)*(1 + x)

    In [2]: apart(1/( (x+2)*(x+1) ), x)

    Out[2]:

    1 1

    ───── - ─────

    1 + x 2 + x

    In [3]: (x+1)/(x-1)

    Out[3]:

    -(1 + x)

    ────────

    1 - x

    In [4]: apart((x+1)/(x-1), x)

    Out[4]:

    2

    1 - ─────

    1 - x

    代数式的合并

    (相当于展开的逆运算),使用together(expr, x):

    In [7]: together(1/x + 1/y + 1/z)

    Out[7]:

    x*y + x*z + y*z

    ───────────────

    x*y*z

    In [8]: together(apart((x+1)/(x-1), x), x)

    Out[8]:

    -1 - x

    ──────

    1 - x

    In [9]: together(apart(1/( (x+2)*(x+1) ), x), x)

    Out[9]:

    1

    ───────────────

    (2 + x)*(1 + x)

    微积分

    极限

    在sympy中极限容易求出,它们遵循极限语法 limit(function, variable, point) ,所以计算x->0时f(x)的极限,即limit(f, x, 0):

    >>>from sympy import *

    >>>x=Symbol("x")

    >>>limit(sin(x)/x, x, 0)

    1

    >>>limit(x, x, oo)

    oo

    >>>limit(1/x, x, oo)

    0

    >>>limit(x**x, x, 0)

    1

    有一些特殊的极限的例子,可以阅读文件test_demidovich.py

    微分

    可以对任意SymPy表达式微分。diff(func, var)。例如:

    >>>from sympy import *

    >>>x = Symbol('x')

    >>>diff(sin(x), x)

    cos(x)

    >>>diff(sin(2*x), x)

    2*cos(2*x)

    >>>diff(tan(x), x)

    1 + tan(x)**2

    可以通过以下验证:

    >>>limit((tan(x+y)-tan(x))/y, y, 0)

    1 + tan(x)**2

    计算高阶微分 diff(func, var, n) :

    >>>diff(sin(2*x), x, 1)

    2*cos(2*x)

    >>>diff(sin(2*x), x, 2)

    -4*sin(2*x)

    >>>diff(sin(2*x), x, 3)

    -8*cos(2*x)

    级数展开

    函数 series(var, point, order):

    >>>from sympy import *

    >>>x = Symbol('x')

    >>>cos(x).series(x, 0, 10)

    1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)

    >>>(1/cos(x)).series(x, 0, 10)

    1 + x**2/2 + 5*x**4/24 + 61*x**6/720 + 277*x**8/8064 + O(x**10)

    积分

    SymPy支持不定积分,超越函数与特殊函数的定积分。SymPy有力的扩展Risch-Norman 算法和模型匹配算法。

    >>>from sympy import *

    >>>x, y = symbols('xy')

    初等函数:

    >>>integrate(6*x**5, x)

    x**6

    >>>integrate(sin(x), x)

    -cos(x)

    >>>integrate(log(x), x)

    -x + x*log(x)

    >>>integrate(2*x + sinh(x), x)

    cosh(x) + x**2

    特殊函数:

    >>>integrate(exp(-x**2)*erf(x), x)

    pi**(1/2)*erf(x)**2/4

    定积分:

    >>>integrate(x**3, (x, -1, 1))

    0

    >>integrate(sin(x), (x, 0, pi/2))

    1

    >>>integrate(cos(x), (x, -pi/2, pi/2))

    2

    一些广义积分也可以被支持:

    >>>integrate(exp(-x), (x, 0, oo))

    1

    >>>integrate(log(x), (x, 0, 1))

    -1

    复数

    >>>from sympy import Symbol, exp, I

    >>>x = Symbol("x")

    >>>exp(I*x).expand()

    exp(I*x)

    >>>exp(I*x).expand(complex=True)

    I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))

    >>>x = Symbol("x", real=True)

    >>>exp(I*x).expand(complex=True)

    I*sin(x) + cos(x)

    函数

    三角函数::

    In [1]: sin(x+y).expand(trig=True)

    Out[1]: cos(x)*sin(y) + cos(y)*sin(x)

    In [2]: cos(x+y).expand(trig=True)

    Out[2]: cos(x)*cos(y) - sin(x)*sin(y)

    In [3]: sin(I*x)

    Out[3]: I*sinh(x)

    In [4]: sinh(I*x)

    Out[4]: I*sin(x)

    In [5]: asinh(I)

    Out[5]:

    π*I

    ───

    2

    In [6]: asinh(I*x)

    Out[6]: I*asin(x)

    In [15]: sin(x).series(x, 0, 10)

    Out[15]:

    3 5 7 9

    x x x x

    x - ── + ─── - ──── + ────── + O(x**10)

    6 120 5040 362880

    In [16]: sinh(x).series(x, 0, 10)

    Out[16]:

    3 5 7 9

    x x x x

    x + ── + ─── + ──── + ────── + O(x**10)

    6 120 5040 362880

    In [17]: asin(x).series(x, 0, 10)

    Out[17]:

    3 5 7 9

    x 3*x 5*x 35*x

    x + ── + ──── + ──── + ───── + O(x**10)

    6 40 112 1152

    In [18]: asinh(x).series(x, 0, 10)

    Out[18]:

    3 5 7 9

    x 3*x 5*x 35*x

    x - ── + ──── - ──── + ───── + O(x**10)

    6 40 112 1152

    球谐函数:

    In [1]: from sympy.abc import theta, phi

    In [2]: Ylm(1, 0, theta, phi)

    Out[2]:

    ————

    ╲╱ 3 *cos(θ)

    ────────────

    ——

    2*╲╱ π

    In [3]: Ylm(1, 1, theta, phi)

    Out[3]:

    —— I*φ

    -╲╱ 6 *│sin(θ)│*ℯ

    ────────────────────

    ——

    4*╲╱ π

    In [4]: Ylm(2, 1, theta, phi)

    Out[4]:

    ——— I*φ

    -╲╱ 30 *│sin(θ)│*cos(θ)*ℯ

    ────────────────────────────

    ——

    4*╲╱ π

    阶乘和伽玛函数:

    In [1]: x = Symbol("x")

    In [2]: y = Symbol("y", integer=True)

    In [3]: factorial(x)

    Out[3]: Γ(1 + x)

    In [4]: factorial(y)

    Out[4]: y!

    In [5]: factorial(x).series(x, 0, 3)

    Out[5]:

    2 2 2 2

    x *EulerGamma π *x

    1 - x*EulerGamma + ────────────── + ───── + O(x**3)

    2 12

    Zeta函数:

    In [18]: zeta(4, x)

    Out[18]: ζ(4, x)

    In [19]: zeta(4, 1)

    Out[19]:

    4

    π

    ──

    90

    In [20]: zeta(4, 2)

    Out[20]:

    4

    π

    -1 + ──

    90

    In [21]: zeta(4, 3)

    Out[21]:

    4

    17 π

    - ── + ──

    16 90

    多项式

    In [1]: chebyshevt(2, x)

    Out[1]:

    2

    -1 + 2*x

    In [2]: chebyshevt(4, x)

    Out[2]:

    2 4

    1 - 8*x + 8*x

    In [3]: legendre(2, x)

    Out[3]:

    2

    3*x

    -1/2 + ────

    2

    In [4]: legendre(8, x)

    Out[4]:

    2 4 6 8

    35 315*x 3465*x 3003*x 6435*x

    ─── - ────── + ─────── - ─────── + ───────

    128 32 64 32 128

    In [5]: assoc_legendre(2, 1, x)

    Out[5]:

    —————

    ╱ 2

    -3*x*╲╱ 1 - x

    In [6]: assoc_legendre(2, 2, x)

    Out[6]:

    2

    3 - 3*x

    In [7]: hermite(3, x)

    Out[7]:

    3

    -12*x + 8*x

    微分方程

    在isympy中:

    In [4]: f(x).diff(x, x) + f(x) #注意在使用输入该命令之前,一定要声明f=Function('f')

    Out[4]:

    2

    d

    ─────(f(x)) + f(x)

    dx dx

    In [5]: dsolve(f(x).diff(x, x) + f(x), f(x))

    Out[5]: C₁*sin(x) + C₂*cos(x)

    代数方程

    在isympy中:

    In [7]: solve(x**4 - 1, x)

    Out[7]: [i, 1, -1, -i]

    In [8]: solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y])

    Out[8]: {y: 1, x: -3}

    线性代数

    矩阵

    矩阵由矩阵类创立建:

    >>>from sympy import Matrix

    >>>Matrix([[1,0], [0,1]])

    [1, 0]

    [0, 1]

    不只是数值矩阵,亦可为代数矩阵,即矩阵中存在符号:

    >>>x = Symbol('x')

    >>>y = Symbol('y')

    >>>A = Matrix([[1,x], [y,1]])

    >>>A

    [1, x]

    [y, 1]

    >>>A**2

    [1 + x*y, 2*x]

    [ 2*y, 1 + x*y]

    关于矩阵更多的例子,请看线性代数教程。

    系数匹配

    使用 .match()方法,引用Wild类,来执行表达式的匹配。该方法会返回一个字典。

    >>>from sympy import *

    >>>x = Symbol('x')

    >>>p = Wild('p')

    >>>(5*x**2).match(p*x**2)

    {p_: 5}

    >>>q = Wild('q')

    >>>(x**2).match(p*x**q)

    {p_: 1, q_: 2}

    如果匹配不成功,则返回None:

    >>>print (x+1).match(p**x)

    None

    可以使用Wild类的‘exclude’参数(排除参数),排除不需要和无意义的匹配结果,来保证结论中的显示是唯一的:

    >>>x = Symbol('x')

    >>>p = Wild('p', exclude=[1,x])

    >>>print (x+1).match(x+p) # 1 is excluded

    None

    >>>print (x+1).match(p+1) # x is excluded

    None

    >>>print (x+1).match(x+2+p) # -1 is not excluded

    {p_: -1}

    打印输出

    标准

    str(expression)返回如下:

    >>>from sympy import Integral

    >>>from sympy.abc import x

    >>>print x**2

    x**2

    >>>print 1/x

    1/x

    >>>print Integral(x**2, x)

    Integral(x**2, x)

    Pretty Printing

    用pprint函数可以输出不错的ascii艺术:

    >>>from sympy import Integral, pprint

    >>>from sympy.abc import x

    >>>pprint(x**2) #doctest: +NORMALIZE_WHITESPACE

    2

    x

    >>>pprint(1/x)

    1

    -

    x

    >>>pprint(Integral(x**2, x))

    /

    |

    | 2

    | x dx

    |

    /

    [Pretty PrintingWiki]

    提示:在python解释器中,为使pretty printing为默认输出,使用:

    $ python

    Python 2.5.2 (r252:60911, Jun 25 2008, 17:58:32)

    [GCC 4.3.1] on linux2

    Type "help", "copyright", "credits" or "license" for more information.

    >>> from sympy import *

    >>> import sys

    >>> sys.displayhook = pprint

    >>> var("x")

    x

    >>> x**3/3

    3

    x

    --

    3

    >>> Integral(x**2, x) #doctest: +NORMALIZE_WHITESPACE

    /

    |

    | 2

    | x dx

    |

    /

    Python printing

    >>>from sympy.printing.python import python

    >>>from sympy import Integral

    >>>from sympy.abc import x

    >>>print python(x**2)

    x = Symbol('x')

    e = x**2

    >>>print python(1/x)

    x = Symbol('x')

    e = 1/x

    >>>print python(Integral(x**2, x))

    x = Symbol('x')

    e = Integral(x**2, x)

    LaTeX printing

    >>>from sympy import Integral, latex

    >>>from sympy.abc import x

    >>>latex(x**2)

    $x^{2}$

    >>>latex(1/x)

    $\frac{1}{x}$

    >>>latex(Integral(x**2, x))

    $\int x^{2}\,dx$

    MathML

    >>>from sympy.printing.mathml import mathml

    >>>from sympy import Integral, latex

    >>>from sympy.abc import x

    >>>print mathml(x**2)

    x2

    >>>print mathml(1/x)

    x-1

    Pyglet

    >>>from sympy import Integral, preview

    >>>from sympy.abc import x

    >>>preview(Integral(x**2, x)) #doctest:+SKIP

    注解

    Isympy默认调用pprint,所以这就是为什么看到pretty printing为默认的。

    有一个打印的有效模块,sympy.printing。用这个模块实现其他的打印:

    pretty(expr), pretty_print(expr), pprint(expr): 分别返回或者输出,,表达式的漂亮描述。这是相同

    latex(expr), print_latex(expr):分别返回或者输出,LaTex描写的表达式

    mathml(expr), print_mathml(expr):分别返回或者输出,MathML描写的表达式

    print_gtk(expr): 表达式打印到Gtkmathview , 这是一个GTK小配件显示MathML代码。Gtkmathview程序是必须的。

    相关链接

    更多相关内容
  • 问题1: 程序,如下 from sympy import * f = symbols('f', cls=Function) ...1.利用python的Sympy库求解微分方程的解 y=f(x),并尝试利用matplotlib绘制函数图像 程序,如下 from sympy import
  • 神奇的SymPy库——享受被高等数学统治的感觉吧

    多人点赞 热门讨论 2022-05-13 18:10:45
    SymPy 是一个非常神秘的,可以完成很多高数上的操作,极限、微分方程、矩阵都可以实现。

    👦👦一个帅气的boy,你可以叫我Love And Program
    🖱 ⌨个人主页:Love And Program的个人主页
    💖💖如果对你有帮助的话希望三连💨💨支持一下博主

    前言

    SymPy 库是一个非常神秘的库,可以完成很多高数上的操作,以后我终于不怕做高数题咯🤪🤪

    SymPy 基操

           先来个基本的除法练练手,evalf函数可以保留5位数字Rational函数可以处理有理数。

    from sympy import Rational#处理有理数
    r1 = Rational(1/3)
    r2 = Rational(1/3)
    val = (r1 + r2 ) * 4
    print(val.evalf(5))
    val2 = (1/3 + 1/3 ) * 4
    print(val2)
    #2.6667
    #2.6666666666666665
    

    Mul是相乘,其中evaluate属性有延迟效果。

    from sympy import sqrt, pprint, Mul
    x = sqrt(2)
    y = sqrt(3)
    pprint(Mul(x,  y, evaluate=False))
    print('结果为',x * y)
    #√6
    #结果为 sqrt(6)
    from sympy import expand, pprint
    from sympy.abc import x
    expr = (x + 1) ** 3
    pprint(expr)
    print('*******************')
    #将其扩展开
    expr = expand(expr)
    pprint(expr)
    #       3
    #(x + 2) 
    #*******************
    # 3      2           
    #x  + 6⋅x  + 12⋅x + 8
    
    这个库比正常直接计算更为精确,而且pprint函数还有修饰作用,更为直观的在程序中感受数学的魅力,欲听后事如何,咱们下面继续讲😁
    然后...猜猜我在`Mul`函数中还发现什么?

    在这里插入图片描述
           源码中这几个公式是不是很熟悉,小学学的乘法交换律,分配率?!哈哈,有点怀念哦,不行,简单了,让我们上上强度,小学数学跳跳,上初中。


    初中部分

           顺延上面的公式,用solve函数求解,第一个参数是公式第二个参数是需要解决的符号,于是单个变量的公式都可以用代码轻松计算。

    #       3
    #(x + 2) 
    from sympy import Symbol, solve
    x = Symbol('x')
    expr = (x + 2) ** 3
    sol = solve(expr, x)
    print(sol)
    #结果:[-2]
    

    还有一种方法也可以求解,Eq用于公式,下面求的是一个(x+2)^2=4的公式

    #       2    
    #(x + 2)  = 4
    from sympy import Symbol, solve
    x = Symbol('x')
    eq1 = Eq((x + 2) ** 2, 4)
    sol = solve(eq1, x)
    print(sol)
    #结果:[-4, 0]
    

    那两个变量呢?

    当然也可以

    from sympy import symbols, solve
    x,y = symbols('x y')
    eq1 = Eq((x + 2) ** 2+y, y)
    pprint(eq1)
    sol = solve(eq1, x)
    print(sol)
    #           2    
    #y + (x + 2)  = y
    #[-2]
    
    肯定会有人想y=x会是啥样,自己试试去🤪咱们接着上强度,高数上

    高数部分

    微分方程

    上强度前我先问问大家,微分方程相关的科目学的咋样,我先来我先来,高数89,线代61,勉强过关吧,嘿嘿。既然如此,那...先来个微分方程试试水?。

    先来一个二阶常系数齐次线性微分方程求解:
    在这里插入图片描述

    from sympy import Symbol, symbols
    from sympy.abc import x, y
    f=Function('f')
    print(dsolve(Derivative(f(x),x,x)-5*Derivative(f(x),x)+6*f(x),f(x)))
    #Eq(f(x), (C1 + C2*exp(x))*exp(2*x))
    

           Derivative函数是求导Derivative(f(x),x,x)意思为f(x)x求两次导数,dsolve函数则是对f(x)求微分(可微即可导,可导不一定可微😏熟悉不)

    上述结果如下,和代码结果是一样的。
    在这里插入图片描述


    是不是感觉还不错,再来一道?!
    在这里插入图片描述
    两次求导,加函数本身,得出结果。

    from sympy import Symbol, symbols
    from sympy.abc import x, y
    f=Function('f')
    print(dsolve(Derivative(f(x),x,x)+25*f(x),f(x)))
    #Eq(f(x), C1*sin(5*x) + C2*cos(5*x))
    

    结果与代码一致
    在这里插入图片描述


    极限

    最后来个极限收收尾吧~~

    来看看下面几个题。

    1、直接带入法

    sympy 库中有专门的极限函数limit,也有专门代表极限的函数oo,然后解函数吧。

    from sympy import sin, limit, oo
    from sympy.abc import x
    l2 = limit(x**2-x, x, 3)
    print(l2)
    #6
    

    2、因式分解法
    在这里插入图片描述

    from sympy import limit, oo, symbols
    from sympy.abc import x
    m,n = symbols('m n')
    l2 = limit((x**m-1)/(x**n-1), x, 1)
    print(l2)
    #m/n
    

    3、概念判断法
    在这里插入图片描述

    from sympy import sin, limit, oo, symbols
    from sympy.abc import x
    m,n = symbols('m n')
    l2 = limit((1/x)*(sin(1/x)), x, oo)
    print(l2)
    #0
    

    4、洛必达求导法
    在这里插入图片描述

    from sympy import cos, limit, oo, symbols, ln
    from sympy.abc import x
    m,n = symbols('m n')
    l2 = limit((3*sin(x)+((x**2)*cos(1/x)))/((1+cos(x))*ln(x+1)), x, 0)
    print(l2)
    #3/2
    
    文章到这就结束了,SymPy完全用 Python 编写,只依赖于mpmath,比较容易上手,没事可以来试试实现高级算法公式,提升提升自己能力哦,就是这样。
    展开全文
  • 首先从cmd中导入scipy,输入代码:pip install scipy注意: pip版本最好也要更新到最新版,否则容易发生版本冲突的问题。但是出现异常:read time out这时想到的解决方式是修改默认的时间:pip --default-timeout=...

    首先从cmd中导入scipy库,输入代码:

    pip install scipy

    注意: pip版本最好也要更新到最新版,否则容易发生版本冲突的问题。

    但是出现异常:read time out

    这时想到的解决方式是修改默认的时间:

    pip --default-timeout=100 install scipy

    仍然不能解决,出现上述异常。

    然后查看自己需要安装的scipy版本是否正确,,进入python命令行中,输入代码:

    import wheel.pep425tags as w

    print(w.get_supported())

    但是会出现异常:

    get_supported() missing 1 required positional argument: ‘archive_root’

    这时需要在括号中写入"archive_root"即可:

    import wheel.pep425tags as w

    print(w.get_supported("archive_root"))

    问题得到解决,可以输出以下信息:

    [('cp37', 'cp37m', 'win_amd64'), ('cp37', 'none', 'win_amd64'), ('cp37', 'none', 'any'), ('cp3', 'none', 'any'), ('cp36', 'none', 'any'), ('cp35', 'none', 'any'), ('cp34', 'none', 'any'), ('cp33', 'none', 'any'), ('cp32', 'none', 'any'), ('cp31', 'none', 'any'), ('cp30', 'none', 'any'), ('py3', 'none', 'win_amd64'), ('py37', 'none', 'any'), ('py3', 'none', 'any'), ('py36', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'none', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')]

    根据上面的‘cp37’、‘win_amd64’可以知道应该安装的版本。到Unofficial Windows Binaries for Python Extension Packages下载正确的scipy库版本即可。

    下载界面如图所示:

    这里我查阅了网络,有一些其他的解决方式,但是我都不行,但避免以后遇到问题,还是在这里写一下

    对于python3.x版本:

    import pip._internal

    print(pip._internal.pep425tags.get_supported())

    对于python2.x版本:

    import pip

    print(pip.pep425tags.get_supported())

    但是上面的两个方式我都出现问题:

    module pip._internal has no attribute pep425tags 或者 module pip has no attribute pep425tags

    将正确的版本下载到python文件夹的scripts下之后,进行安装。

    注意 :这里有个坑,如果从cmd中进入到下载的文件夹下,输入代码pip install scipy-1.5.2-cp37-cp37m-win_amd64.whl。那么再次pip list会发现,此时石油scipy库的,但是依然不能import这个库。然而当退出这个路径后,输入pip list,发现还是没有scipy库。

    所以这里需要进行的正确操作是:在cmd中直接输入代码

    pip install C:\Users\Zhao Zihan\AppData\Local\Programs\Python\Python38\Scripts\scipy-1.5.2-cp37-cp37m-win_amd64.whl

    当然,这里会有路径中含有空格的问题,所以需要在路径外添加双引号,即:

    pip install "C:\Users\Zhao Zihan\AppData\Local\Programs\Python\Python38\Scripts\scipy-1.5.2-cp37-cp37m-win_amd64.whl"

    这样再次pip list就能发现下载成功,也可以进行import了。

    最后是下载和导入sympy库,下载方式与上文的连接相同。所以这里不作赘述。

    这里借鉴了以下博文:

    module pip._internal has no attribute pep425tags 或者 module pip has no attribute pep425tags

    wheel.pep425tags.getsupported()报错解决方法

    Python 语法问题-module ‘pip’ has no attribute ‘pep425tags’,告诉你如何正确查看pip支持,32位、64位查看pip支持万能方法

    展开全文
  • Python中sympy库的基础应用

    千次阅读 2020-06-04 17:25:31
    官网sympy库文档地址:docs.sympy.org/ sympy库是什么: sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等计算问题。虽然...

     

    官网sympy库文档地址:docs.sympy.org/

    sympy库是什么:

    sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等计算问题。虽然Matlab的类似科学计算能力也很强大,但是Python以其语法简单、易上手、异常丰富的三方库生态,使其可以更优雅地解决日常遇到的各种计算问题。

    前言:写这篇文档的目的是数学建模竞赛使用python编程软件来制作,而牵扯到了数学,则学习sympy库则是必不可缺的,所以便查阅资料写下此篇文章方便一起比赛的同学参考学习。

    安装sympy库的流程我在此便不再赘述,下面直接进入正题。

    使用代码表示数学符号与手写体的数学运算符号存在一定的差异,下面列举常用的运算符:

    • 加号 +
    • 减号 -
    • 除号 /
    • 乘号 *
    • 指数 **
    • 对数 log()
    • e的指数次幂 exp()
    • 虚数I
    • 无穷大oo
    • 圆周率pi

    求虚数单位i:

    In [1]: import sympy
    
    In [2]: sympy.I
    Out[2]: I
    
    In [3]: sympy.I ** 2
    Out[3]: -1
    
    # 求-1的平方根
    In [4]: sympy.sqrt(-1)
    Out[4]: I

    求自然对数的底e:

    In [5]: sympy.E
    Out[5]: E
    
    # 求对数
    In [6]: sympy.log(sympy.E)
    Out[6]: 1

    求无穷大oo:

    In [7]: 1/sympy.oo
    Out[7]: 0
    
    In [8]: 1 + sympy.oo
    Out[8]: oo

    求圆周率pi相关:

    In [9]: sympy.pi
    Out[9]: pi
    
    #求sin(π/2)
    In [10]: sympy.sin(sympy.pi/2)
    Out[10]: 1

    求对数:

    # 自然对数
    In [1]: sympy.log(sympy.E)
    Out[1]: 1
    
    In [2]: sympy.log(sympy.E ** 3)
    Out[2]: 3
    
    # 以10为底10000的对数
    In [3]: sympy.log(10000,10)
    Out[3]: 4

    求n次方根:

    # 求8的3次方根
    In [15]: sympy.root(8,3)
    Out[15]: 2
    注释:平方根用sqrt和root都可以

    求k次方:

    In [1]: 2 ** 3
    Out[1]: 8
    
    In [2]: 16 ** (1/2)
    Out[2]: 4.0

    求阶乘:

    In [3]:  sympy.factorial(4)
    Out[3]:  24

    求三角函数:

    In [6]: sympy.sin(sympy.pi)
    Out[6]: 0
    
    In [7]: sympy.sin(sympy.pi/2)
    Out[7]: 1
    In [8]: sympy.cos(sympy.pi/2)
    Out[8]: 0

    简单介绍下上述使用方法,接下来解决实际问题:

    表达式与表达式求值:

    sympy可以用一套符号系统来表示一个表达式,如函数、多项式等,并且可以进行求值,例如:

    # 首先定义x为一个符号,表示一个变量
    In [1]: x = sympy.Symbol('x')
    
    In [2]: fx = 2*x + 1
    
    # 可以看到fx是一个sympy.core.add.Add类型的对象,也就是一个表达式(type表示类型)
    In [3]: type(fx)
    Out[3]: sympy.core.add.Add
    
    # 用evalf函数,传入变量的值,对表达式进行求值
    In [4]: fx.evalf(subs={x:2})
    Out[4]: 5.00000000000000
    此处是evalf函数并非eval函数
    evalf()函数可以用求出表达式的浮点数。
    例:
    In [3]:from sympy import *
    In [4]:a=Symbol('a')
    In [5]:(1/a).evalf(subs={a:3.0} ,n=21) 
    Out[5]:0.333333333333333333333
    由此我们可以看出n=21表示保留小数点后21位
    
    
    
    
    
    注释:eval() 函数用来执行一个字符串表达式,并返回表达式的值。
    语法:eval(expression[, globals[, locals]])
    参数:
    expression -- 表达式。
    globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

    支持多元表达式表达:

    In [2]: x,y = sympy.symbols('x y')
    
    In [3]: f = 2 * x + y
    
    # 以字典的形式传入多个变量的值(注意此处为字典键值对形式)
    In [4]: f.evalf(subs = {x:1,y:2})
    Out[4]: 4.00000000000000
    
    # 如果只传入一个变量的值,则原本输出原来的表达式
    In [5]: f.evalf(subs = {x:1})
    Out[5]: 2.0*x + y
    

    解方程(组):

    使用sympy.solve函数解方程,该函数通常传入两个参数,第1个参数是方程的表达式(把方程所有的项移到等号的同一边形成的式子),第2个参数是方程中的未知数。函数的返回值是一个列表,代表方程的所有根(可能为复数根),

    形式为:solve(f, symbols, flags)

    例:解个简单方程
    # 首先定义 `x`为一个符号,代表一个未知数
    In [1]: x = sympy.Symbol('x')
    
    # 解方程:x - 1 = 0
    In [2]: sympy.solve(x - 1,x)
    Out[2]: [1]
    
    # 解方程:x ^ 2 - 1 = 0
    In [3]: sympy.solve(x ** 2 - 1,x)
    Out[3]: [-1, 1]
    
    # 解方程:x ^ 2 + 1 = 0
    In [4]: sympy.solve(x ** 2 + 1,x)
    Out[4]: [-I, I]
    
    例:解方程组:
    # 一次性定义多个符号
    In [28]: x,y = sympy.symbols('x y')
    
    In [29]: sympy.solve([x + y - 1,x - y -3],[x,y])
    Out[29]: {x: 2, y: -1}
    

    此时我想你们已经发现了:定义一个未知数符号用的Symbol,而定义多个则用symbols,注意大小写

    计算求和式:

    计算求和式可以使用sympy.summation函数,其函数原型为:

    sympy.summation(f, *symbols, **kwargs)

    在Python中的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。

    别被这些语句所绊倒。其实这些并不是什么超级特殊的参数,也并不奇特,只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字参数。

    这其实就是 Python 中可变参数的两种形式,并且 *args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。

    话不多少,举个栗子,比如求下面这个求和式子的值:

    In [37]: n = sympy.Symbol('n')
    
    In [38]: sympy.summation(3 * n,(n,1,100))
    Out[38]: 15150
    是不是很方便呢哈哈哈哈
    如果sympy.summation函数无法计算出具体的结果,那么会返回求和表达式。

    解带有求和式的方程:

    In [43]: x = sympy.Symbol('x')
    
    In [44]: i = sympy.Symbol('i',integer = True)
    
    In [46]: f =  sympy.summation(x,(i,1,5)) + 10 * x - 15
    
    In [47]: sympy.solve(f,x)
    Out[47]: [1]

    注释:integer--整数,是numeric的一部分

    求极限

    求极限用sympy.limit函数,官方文档如下:

    Signature: sympy.limit(e, z, z0, dir='+')
    Docstring:
    Compute the limit of e(z) at the point z0.
    
    z0 can be any expression, including oo and -oo.
    
    For dir="+" (default) it calculates the limit from the right
    (z->z0+) and for dir="-" the limit from the left (z->z0-).  For infinite
    z0 (oo or -oo), the dir argument is determined from the direction
    of the infinity (i.e., dir="-" for oo).

    下面给出3个例子求微积分的极限:

    In [53]: x = sympy.Symbol('x')
    
    In [54]: f1 = sympy.sin(x)/x
    
    In [55]: sympy.limit(f1,x,0)
    Out[55]: 1
    
    In [56]: f2 = (1+x)**(1/x)
    
    In [57]: sympy.limit(f2,x,0)
    Out[57]: E
    
    In [58]: f3 = (1+1/x)**x
    
    In [59]: sympy.limit(f3,x,sympy.oo)
    Out[59]: E
    第一个参数表示表达式,第二个参数表示需要求的未知量x(即变量名x),第二个参数表示x趋于的值

    求导:

    求导使用sympy.diff函数,传入2个参数:函数表达式变量名,举例:

    In [1]: x = sympy.Symbol('x')
    
    In [2]: f = x ** 2 + 2 * x + 1
    
    In [3]: sympy.diff(f,x)
    Out[3]: 2*x + 2
    
    In [4]: f2 = sympy.sin(x)
    
    In [6]: sympy.diff(f2,x)
    Out[6]: cos(x)
    
    # 多元函数求偏导
    In [1]: y = sympy.Symbol('y')
    
    In [2]: f3 = x**2 + 2*x + y**3
    
    In [3]: sympy.diff(f3,x)
    Out[3]: 2*x + 2
    
    In [4]: sympy.diff(f3,y)
    Out[4]: 3*y**2

    求定积分:

    使用sympy.integrate函数求定积分,其功能比较复杂,非常强大,下面仅举几个比较简单的例子:

    In [74]: x = sympy.Symbol('x')
    
    In [75]: f = 2 * x
    
    # 传入函数表达式和积分变量、积分下限、上限
    In [76]: sympy.integrate(f,(x,0,1))
    Out[76]: 1
    牛顿-莱布尼兹公式

    下面来算一个复杂一点的多重积分:

    其中:

    我们通过口算可以求出f(x):

    所以:

    下面用代码来实现上述过程:

    In [82]: t,x = sympy.symbols('t x')
    
    In [83]: f = 2 * t
    #此处换元法引入t
    
    In [84]: g = sympy.integrate(f,(t,0,x))
    
    In [85]: sympy.integrate(g,(x,0,3))
    Out[85]: 9

    求不定积分:

    同样也是使用sympy.integrate函数求不定积分

     

    我们知道它的结果是:

    用代码来计算这个不定积分的结果:

    In [1]: x = sympy.Symbol('x')
    
    In [2]: f = sympy.E ** x + 2 * x
    
    In [3]: sympy.integrate(f,x)
    Out[3]: x**2 + exp(x)
     注: exp(x)表示e的x方

    本文只是简单介绍了下sympy库的初步使用以及初步涉及高数,更多算法功能等我继续挖掘学习后再来探讨。

    展开全文
  • python之sympy库--数学符号计算与绘图必备

    万次阅读 多人点赞 2020-12-12 18:47:32
    也叫等式,或者方程式,标示exp1=exp2,比如x+y=3,默认exp2=0 取等式的左半部分:eq.lhs 取等式的右半部分:eq.rhs 1.3 sympy常用内置符号 常用内置符号 符号 说明 示意 sympy.I 虚数单位i sympy.E 自然对数的底e ...
  • 摘要:在学习与科研中,经常会遇到一些数学运算问题,使用计算机完成运算具有速度快和准确性高的优势。Python的Numpy包具有强大的科学运算功能,且具有其他许多主流科学计算语言不...1.Sympy库简介SymPy一个用于符...
  • 用python进行高数里的微积分,极限,级数等运算
  • 数学建模-用Sympy库求解一些微分方程 例题1:解下列微分方程的特解 from sympy.abc import x #因为sympy的计算都是需要符号变量声明的 例如x=symbols('x'); 使用abc库可以将任何拉丁和希腊字母导出为符号型的 from ...
  • import sympy as sp # 求determinant---行列式 matrix_A = sp.Matrix([[1, 2, 3], [4, 6, 8], [7, 3, 2]]) determinant = matrix_A.det() # 求rref---行最简形 matrix_B = sp.Matrix([[1, 0, 1, 3], [2, 3, 4, 7], ...
  • 数据科学之sympy库

    千次阅读 2019-05-21 23:37:39
    sympy是一个Python的科学计算,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。 Python以其语法简单、易上手、丰富的三方生态,个人认为可以...
  • 利用symps实现python中代数符号运算和推导,并给出代码示例。
  • 【sympy】python 求常微分方程 sympy库

    万次阅读 2020-04-26 22:49:34
    问题1: f′′(x)−2f′(x)+f(x)=sin(x)f''(x)-2f'(x) + f(x) = sin(x)f′′(x)−2f′(x)+f(x)...from sympy import * f= symbols('f', cls=Function) eq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x) - sin(x)) p...
  • Python的sympy库的基础运用

    千次阅读 2021-01-21 16:40:33
    基础运用 from sympy import * 注意全局引用,容易发生错误 symbols()——构件符号变量—— x,y,z=symbols('x y z') m0,m1,m2,m3=symbols('m0:4') #创建多个符号变量 平时变量不多时往往这么写 from sympy.abc import...
  • 本篇文章小编给大家简单分享一下python中sympy库求常微分方程的用法代码解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。问题1:程序,如下from sympy ...
  • 用Python学数学之Sympy代数符号运算
  • SymPy学习、交流
  • 一、课程介绍 二、实验环境 三、实验原理 四、实验步骤
  • sympy库+泰勒展开+求极限
  • PYTHON(SymPy模块)的微分方程该存储库的目的是使用SymPy库通过python编程语言解决微分方程课程的基本概念,并用作验证知识和解决与微分方程有关的问题的工具。目录
  • 函数极限与sympy库欢迎访问我的这部分可以参考sympy库中的在$z_0$点处计算$e(z)$函数的极限\(\lim_{z \to z_0} e(z)\) = limit(e, z, z0, dir='+')求极限实例给出函数表达式,求其极限结果。examples\[ \lim_{x \to ...
  • from sympy import * x = symbols('x') print(solve(Eq(x**5+x**4+x**3+x**2+x,7.316),x)) print(1.12968077101867**5+1.12968077101867**4+1.12968077101867**3+1.12968077101867**2+1.12968077101867) 输出: [1...
  • python——sympy库

    2020-04-21 00:11:58
    常用的sympy内置符号 虚数单位i In [13]: import sympy In [14]: sympy.I Out[14]: I In [15]: sympy.I ** 2 Out[15]: -1 # 求-1的平方根 In [16]: sympy.sqrt(-1) Out[16]: I 自然对数的底e In [18]: sympy.E ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,947
精华内容 1,578
关键字:

sympy库

友情链接: NR2_SETUP.zip