# Демонстрация. Методы научного программирования на примере библиотеки символьных вычислений SymPy.  

На основе [урока от Jülich Supercomputing Centre](https://docs.jupyter-jsc.fz-juelich.de/github/FZJ-JSC/jupyter-jsc-notebooks/blob/master/001-Jupyter/001-Tutorials/001-Basic-Tutorials/001-IPython-Kernel/SymPy.ipynb).

Добавляйте ячейки исходного кода программы: 


```python
from IPython.display import display

from sympy.interactive import printing
printing.init_printing()

from __future__ import division
import sympy as sym
from sympy import *
x, y, z = symbols("x y z")
k, m, n = symbols("k m n", integer=True)
f, g, h = map(Function, 'fgh')
```

<h2>Добавляйте подзаголовки</h2>
И свои комментарии:

Исполняемые фрагменты кода: 

<h2>Алгебра<h2>


```python
eq = ((x+y)**2 * (x+1))
eq
```


```python
expand(eq)
```


```python
a = 1/x + (x*sin(x) - 1)/x
a
```


```python
simplify(a)
```


```python
eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0)
eq
```


```python
solve(eq, x)
```


```python
a, b = symbols('a b')
Sum(6*n**2 + 2**n, (n, a, b))
```

<h2>Мат. анализ</h2>


```python
limit((sin(x)-x)/x**3, x, 0)
```


```python
(1/cos(x)).series(x, 0, 6)
```


```python
diff(cos(x**2)**2 / (1+x), x)
```


```python
integrate(x**2 * cos(x), (x, 0, pi/2))
```


```python
eqn = Eq(Derivative(f(x),x,x) + 9*f(x), 1)
display(eqn)
dsolve(eqn, f(x))
```

#Научная визуализация

На примере разложения в ряд тейлора.


```python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
```


```python
def plot_taylor_approximations(func, x0=None, orders=(2, 4), xrange=(0,1), yrange=None, npts=200):
    """Plot the Taylor series approximations to a function at various orders.

    Parameters
    ----------
    func : a sympy function
    x0 : float
      Origin of the Taylor series expansion.  If not given, x0=xrange[0].
    orders : list
      List of integers with the orders of Taylor series to show.  Default is (2, 4).
    xrange : 2-tuple or array.
      Either an (xmin, xmax) tuple indicating the x range for the plot (default is (0, 1)),
      or the actual array of values to use.
    yrange : 2-tuple
      (ymin, ymax) tuple indicating the y range for the plot.  If not given,
      the full range of values will be automatically used. 
    npts : int
      Number of points to sample the x range with.  Default is 200.
    """
    if not callable(func):
        raise ValueError('func must be callable')
    if isinstance(xrange, (list, tuple)):
        x = np.linspace(float(xrange[0]), float(xrange[1]), npts)
    else:
        x = xrange
    if x0 is None: x0 = x[0]
    xs = sym.Symbol('x')
    # Make a numpy-callable form of the original function for plotting
    fx = func(xs)
    f = sym.lambdify(xs, fx, modules=['numpy'])
    # We could use latex(fx) instead of str(), but matploblib gets confused
    # with some of the (valid) latex constructs sympy emits.  So we play it safe.
    plt.plot(x, f(x), label=str(fx), lw=2)
    # Build the Taylor approximations, plotting as we go
    apps = {}
    for order in orders:
        app = fx.series(xs, x0, n=order).removeO()
        apps[order] = app
        # Must be careful here: if the approximation is a constant, we can't
        # blindly use lambdify as it won't do the right thing.  In that case, 
        # evaluate the number as a float and fill the y array with that value.
        if isinstance(app, sym.numbers.Number):
            y = np.zeros_like(x)
            y.fill(app.evalf())
        else:
            fa = sym.lambdify(xs, app, modules=['numpy'])
            y = fa(x)
        tex = sym.latex(app).replace('$', '')
        plt.plot(x, y, label=r'$n=%s:\, %s$' % (order, tex) )
        
    # Plot refinements
    if yrange is not None:
        plt.ylim(*yrange)
    plt.grid()
    plt.legend(loc='best').get_frame().set_alpha(0.8)
```

Определив функцию, строим графики:


```python
plot_taylor_approximations(sin, 0, [2, 4, 6], (0, 2*pi), (-2,2))
```


```python
plot_taylor_approximations(cos, 0, [2, 4, 6], (0, 2*pi), (-2,2))
```


```python
plot_taylor_approximations(lambda x: 1/cos(x), 0, [2,4,6], (0, 2*pi), (-5,5))
```

7cb48d5838eaeb2162144224a92dac6d00c352bb
ipynb
Jupyter Notebook
docs/JNotebooks/Demo.ipynb
EugenioAV/research-instruments.github.io
7e08b0b81700817ee3bc3b35744fbca995193b39
Apache-2.0
2021-12-01T16:44:01.000Z
2021-12-21T21:57:20.000Z
docs/JNotebooks/Demo.ipynb
EugenioAV/research-instruments.github.io
7e08b0b81700817ee3bc3b35744fbca995193b39
Apache-2.0
2021-12-15T15:43:50.000Z
2021-12-15T15:43:50.000Z
docs/JNotebooks/Demo.ipynb
EugenioAV/research-instruments.github.io
7e08b0b81700817ee3bc3b35744fbca995193b39
Apache-2.0
2021-12-10T15:55:38.000Z
2021-12-21T21:21:10.000Z
Qwen/Qwen-72B
1. YES
2. YES