Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Uvod

V okviru tega poglavja bomo za dano funkcijo f(x)f(x) izračunali določen integral:

∫ab f(x) dx\int_a^b\,f(x)\,\textrm{d}x

kjer sta aa in bb meji integriranja, f(x)f(x) pa so vrednosti funkcije, ki jih pridobimo iz tabele vrednosti ali s pomočjo analitične funkcije.

Pri numeričnem integriranju integral ocenimo z II in velja

∫ab f(x) dx=I+E,\int_a^b\,f(x)\,\textrm{d}x= I + E,

kjer je EE napaka ocene integrala.

Numerični integral bomo računali na podlagi diskretne vsote:

I=∑i=0mAi f(xi),I=\sum_{i=0}^{m}A_i\,f(x_i),

kjer so AiA_i uteži, xix_i pa vozlišča na intervalu [a,b][a, b] in je m+1m+1 število vozlišč.

Ogledali si bomo dva različna pristopa k numerični integraciji:

  1. Newton-Cotesov pristop, ki temelji na ekvidistantnih vozliščih (konstanten korak integracije) in

  2. Gaussov integracijski pristop, kjer so vozlišča postavljena tako, da se doseže natančnost za polinome.

Motivacijski primer

Pri numeričnem integriranju si bomo pomagali s konkretnim primerom:

∫12x sin⁡(x) dx\int_1^2 x\,\sin(x)\,\textrm{d}x

Pripravimo si vozlišča. Osnovni korak naj bo h=0.25h=0.25, v tem primeru imamo štiri podintervale in pet vozlišč, pri koraku 2h2h so tri vozliščne točke in pri koraku 4h4h samo dve (skrajni):

Pripravimo še funkcijske vrednosti:

Pripravimo prikaz podatkov:

Prikažimo podatke:

<Figure size 640x480 with 1 Axes>

Analitično izračunajmo točen rezultat:

Loading...

Newton-Cotesov pristop

Na sliki je prikazan splošen primer, kjer je razdalja med vozlišči xix_i enaka hh (gre za ekvidistantno delitev). Integriranje

V okviru tega poglavja si bomo najprej pogledali trapezno ter sestavljeno trapezno pravilo, pozneje pa bosta sledili še Simpsonova ter Rombergova metoda.

Trapezno pravilo

Trapezno pravilo vrednosti podintegralske funkcije f(x)f(x) na (pod)intervalu [x0,x1][x_0, x_1] interpolira z linearno funkcijo. Za dve vozliščni točki to pomeni, da površino pod grafom funkcije približno izračunamo kot:

Itrapezno=∑i=01Ai f(xi)=h2⋅(f(x0)+f(x1)).I_{\textrm{trapezno}}=\sum_{i=0}^{1}A_i\,f(x_i)=\frac{h}{2}\cdot\left(f(x_0)+f(x_1)\right).

In so uteži:

A0=A1=12 h.A_0 = A_1 = \frac{1}{2}\,h.
Numerična implementacija

Numerična implementacija je:

Numerični zgled

V konkretnem primeru to pomeni, da prvo in zadnjo funkcijsko vrednost utežimo s h/2h/2. V našem primeru je h=1h=1:

Loading...

Pripravimo sliko:

Prikažemo:

<Figure size 640x480 with 1 Axes>
Napaka trapeznega pravila

Razlika med analitično vrednostjo integrala in numeričnim približkom II je napaka metode:

E=∫abf(x) dx−I,E = \int_a^bf(x)\,d x-I,

Če je funkcija f(x)f(x) vsaj dvakrat odvedljiva, se lahko (glejte npr. vir: Burden, Faires, Burden: Numerical Analysis 10th Ed) izpelje ocena napake, ki velja samo za trapezni približek prek celega integracijskega intervala:

Etrapezno=−h312f′′(ξ),E_{\textrm{trapezno}}=-\frac{h^3}{12}f''(\xi),

kjer je h=b−ah=b-a in ξ\xi neznana vrednost na intervalu [a,b][a,b].

Sestavljeno trapezno pravilo

Če razdelimo interval [a,b][a, b] na nn podintervalov in na vsakem uporabimo trapezno pravilo integriranja, govorimo o sestavljenem trapeznem pravilu (angl. composite trapezoidal rule).

V tem primeru za vsak podinterval ii uporabimo trapezno pravilo in torej za meje podinterval xix_i in xi+1x_{i+1} uporabimo uteži Ai=Ai+1=h/2A_i=A_{i+1}=h/2. Ker so notranja vozlišča podvojena, sledi:

A0=An=h2in za ostala vozlisˇcˇa:Ai=h.A_0=A_{n}=\frac{h}{2}\quad\textrm{in za ostala vozlišča:}\quad A_i=h.

Pri tem smo predpostavili podintervale enake širine:

h=xn−x0nh=\frac{x_{n}-x_0}{n}

Sledi torej:

Itrapezno sest=∑i=0nAi f(xi)=(y02+y1+y2+⋯+yn−1+yn2) h.I_{\textrm{trapezno sest}}=\sum_{i=0}^{n}A_i\,f(x_i)=\left(\frac{y_0}{2} + y_1+y_2+\cdots+y_{n-1}+\frac{y_{n}}{2}\right)\,h.
Numerična implementacija

Numerična implementacija je:

Numerični zgled

Zgoraj smo že pripravili podatke za dva podintervala (tri vozlišča):

array([1. , 1.5, 2. ])
Loading...

Izračunajmo oceno integrala s sestavljenim trapeznim pravilom:

Loading...

Pripravimo sliko:

Prikažemo:

<Figure size 640x480 with 1 Axes>
Napaka sestavljenega trapeznega pravila

Napaka sestavljenega trapeznega pravila izhaja iz napake trapeznega pravila; pri tem tako napako naredimo nn-krat.

Ker velja h⋅n=b−ah\cdot n=b-a, izpeljemo napako sestavljenega trapeznega pravila kot:

Etrapezno sest=−h2(b−a)12f′′(η),E_{\textrm{trapezno sest}}=-\frac{h^2(b-a)}{12}f''(\eta),

η\eta je vrednost na intervalu [a,b][a,b]. Napaka je drugega reda O(h2)\mathcal{O}(h^2).

Boljši približek integrala

V nadaljevanju si bomo pogledali t. i. Richardsonovo ekstrapolacijo, pri kateri na podlagi ocene integrala s korakom hh in 2h2h izračunamo boljši približek.

V kolikor integral II numerično izračunamo pri dveh različnih korakih hh in 2 h2\,h, velja:

∫abf(x) dx=Ih+Eh=I2h+E2h,\int_a^b f(x)\,\textrm{d}x = I_h + E_h = I_{2h} + E_{2h},

kjer sta IhI_h in I2hI_{2h} približka integrala s korakom hh in 2h2h ter EhE_h in E2hE_{2h} oceni napake pri koraku hh in 2h2h. Izpeljemo I2h−Ih=Eh−E2hI_{2h}-I_{h} = E_{h}-E_{2h}

Naprej zapišemo:

Eh=−h2(b−a)12f′′(η)=h2 K.E_h=-\frac{h^2(b-a)}{12}f''(\eta)=h^2\,K.

Ob predpostavki, da je f′′(η)f''\left (\eta \right ) pri koraku hh in 2h2h enak (η\eta je pri koraku hh in 2h2h dejansko različen), zapišemo:

E2h=−(2h)2(b−a)12f′′(η)=4 h2 KE_{2h}=-\frac{(2h)^2(b-a)}{12}f''(\eta)=4\,h^2\,K

Sledi:

I2h−Ih=−3K h2.I_{2h}-I_h=-3K\,h^2.

Sedaj lahko ocenimo napako pri koraku hh:

Eh=h2 K=Ih−I2h3.E_h=h^2\,K=\frac{I_h-I_{2h}}{3}.

Na podlagi ocene napake lahko izračunamo boljši numerični približek Ih∗I_{h}^*:

Ih∗=Ih+13 (Ih−I2h)I_h^* = I_h + \frac{1}{3}\,(I_{h}-I_{2h})

ali

Ih∗=43 Ih−13 I2hI_h^* = \frac{4}{3}\,I_h - \frac{1}{3}\,I_{2h}
Numerični zgled

Predhodno smo s trapeznim pravilom že izračunali integral pri koraku h=1h=1 in pri koraku h=0,5h=0,5, rezultata sta bila:

Loading...

S pomočjo zgornje formule izračunamo boljši približek:

Točen rezultat:   1.4404224209802097
Boljši približek: 1.4408392930139313

Sestavljeno trapezno pravilo je implementirano tudi v paketu numpy, s funkcijo numpy.trapezoid (v starejših različicah numpy.trapz):

trapezoid(y, x=None, dx=1.0, axis=-1)
  • y predstavlja tabelo funkcijskih vrednosti,

  • x je opcijski parameter in definira vozlišča; če parameter ni definiran, se privzame ekvidistančna vozlišča na razdalji dx,

  • dx definira (konstanten) korak integracije, ima privzeto vrednost 1,

  • axis definira os po kateri se integrira (v primeru, da je y večdimenzijsko numerično polje).

Funkcija vrne izračunani integral po sestavljenem trapeznem pravilu. Več informacij lahko najdete v dokumentaciji.

numpy implementacija sestavljenega trapeznega pravila

Poglejmo si primer:

Loading...

Simpsonova in druge metode

Zgoraj smo si pogledali trapezno pravilo, ki temelji na linearni interpolacijski funkciji na posameznem podintervalu. Z interpolacijo višjega reda lahko izpeljemo še druge integracijske metode.

Izračunati moramo:

∫abf(x) dx.\int_{a}^b f(x)\,dx.

Tabeliramo podintegralsko funkcijo f(x)f(x) in tabelo interpoliramo z Lagrangevim interpolacijskim polinomom Pn(x)P_n(x) stopnje nn:

Pn(x)=∑i=0n f(xi) li(x),P_n(x)=\sum_{i=0}^{n}\,f(x_i)\,l_i(x),

kjer so yi=f(xi)y_i=f(x_i) funkcijske vrednosti v vozliščih xix_i in je Lagrangev polinom lil_i definiran kot:

li(x)=∏j=0,j≠inx−xjxi−xj.l_i(x)=\prod_{j=0, j\ne i}^n \frac{x-x_j}{x_i-x_j}.

Za numerični izračun integrala ∫abf(x) dx\int_{a}^b f(x)\,dx (meje so: a=x0a=x_0, b=xnb=x_n) namesto funkcije f(x)f(x) vstavimo v integral interpolacijski polinom Pn(x)P_n(x):

I=∫x0xnPn(x) dx=∫x0xn∑i=0n f(xi) li(x) dx.I=\int_{x_0}^{x_{n}} P_n(x)\,dx=\int_{x_0}^{x_{n}} \sum_{i=0}^{n}\,f(x_i)\,l_i(x)\,dx.

Ker je integriranje linearna operacija, lahko zamenjamo integriranje in vsoto:

I=∑i=0n f(xi) ∫x0xnli(x) dx⏟Ai.I=\sum_{i=0}^{n}\,f(x_i)\,\underbrace{\int_{x_0}^{x_{n}} l_i(x)\,dx}_{A_i}.

Lagrangev polinom integriramo in dobimo uteži AiA_i:

Ai=∫x0xnli(x) dxA_i = \int_{x_0}^{x_{n}} l_i(x)\,dx
Izpeljava trapeznega pravila z uporabo Lagrangevih polinomov

Poglejmo si kako z Lagrangevim interpolacijskim polinomom prve stopnje strojno izpeljemo uteži AiA_i v primeru trapeznega pravila.

Najprej v simbolni obliki definirajmo spremenljivko x, vozlišči x0 in x1 ter korak h:

Pripravimo Python funkcijo, ki v simbolni obliki vrne seznam nn koeficientov Lagrangevih polinomov [l0(x),l1(x),…,ln−1(x)][l_0(x), l_1(x),\dots, l_{n-1}(x)] stopnje n−1n-1:

Najprej poglejmo Lagrangeva polinoma za linearno interpolacijo (n=2n=2):

Loading...

Sedaj Lagrangev polinom l0(x)l_0(x) integriramo čez celotni interval:

Loading...

Izraz poenostavimo in dobimo:

Loading...

Ker je širina podintervala konstantna je x1=h0+hx_1=h_0+h, izvedemo zamenjavo:

Loading...

Zgornje korake za Lagrangev polinom l0(x)l_0(x) lahko posplošimo za seznam Lagrangevih polinomov:

Loading...

Izpeljali smo uteži, ki smo jih uporabili pri trapezni metodi:

A0=h/2A1=h/2.A_0=h/2\qquad A_1=h/2.

Trapezno pravilo je:

Itrapezno=h2(y0+y1)I_{\textrm{trapezno}}=\frac{h}{2}\left(y_0+y_1\right)

Ocena napake je (vir: Burden, Faires, Burden: Numerical Analysis 10th Ed):

Etrapezno=−h312f′′(ξ).E_{\textrm{trapezno}}= -\frac{h^3}{12}f''(\xi).
Izračun uteži za Simpsonovo pravilo

Potem ko smo zgoraj pokazali strnjen izračun za trapezno pravilo, lahko podobno izvedemo za kvadratno interpolacijo čez tri točke (n=3n=3).

Izračun uteži je analogen zgornjemu:

Loading...

Simpsonovo pravilo (to pravilo se imenuje tudi Simpsonovo 1/3 pravilo) je:

ISimpsonovo=h3(y0+4 y1+y2)I_{\textrm{Simpsonovo}}=\frac{h}{3}\left(y_0+4\,y_1+y_2\right)

Ocena napake je (vir: Burden, Faires, Burden: Numerical Analysis 10th Ed):

ESimpsonovo=−h590f(4)(ξ).E_{\textrm{Simpsonovo}}= -\frac{h^5}{90}f^{(4)}(\xi).

Pri tem je treba izpostaviti, da je napaka lokalno 5. reda O(h5)\mathcal{O}(h^5) in definirana z neznano vrednostjo četrtega odvoda f(4)(ξ)f^{(4)}(\xi), posledično je to pravilo točno za polinome stopnje 3 ali manj.

Primer uporabe:

Loading...

Pripravimo sliko. Ker Simpsonovo pravilo temelji na kvadratni interpolaciji, moramo najprej pripraviti interpolacijski polinom (pomagamo si z numpy.polynomial.Polynomial):

Prikažemo:

<Figure size 640x480 with 1 Axes>
scipy.integrate.newton_cotes

Koeficiente integracijskega pristopa Newton-Cotes pridobimo tudi s pomočjo scipy.integrate.newton_cotes() dokumentacija:

newton_cotes(rn, equal=0)

kjer sta parametra:

  • rn, ki definira število podintervalov (mogoč je tudi nekonstanten korak, glejte dokumentacijo),

  • equal, ki definira ali se zahteva konstantno široke podintervale.

Funkcija vrne terko, pri čemer prvi element predstavlja numerično polje uteži in drugi člen oceno napake.

Poglejmo si primer:

(array([0.33333333, 1.33333333, 0.33333333]), -0.011111111111111112)
Izračun uteži za Simpsonovo 3/8 pravilo

Nadaljujemo lahko s kubično interpolacijo čez štiri točke (n=4n=4):

Loading...

Simpsonovo 3/8 pravilo je:

ISimpsonovo 3/8=3h8(y0+3 y1+3 y2+y3)I_{\textrm{Simpsonovo 3/8}}=\frac{3h}{8}\left(y_0+3\,y_1+3\,y_2+y_3\right)

Ocena napake je (vir: Burden, Faires, Burden: Numerical Analysis 10th Ed):

ESimpsonovo 3/8=−3 h580f(4)(ξ).E_{\textrm{Simpsonovo 3/8}}= -\frac{3\,h^5}{80}f^{(4)}(\xi).

Poglejmo si primer uporabe. Uporabimo pripravljeno tabelo vrednosti funkcije v štirih točkah:

array([0.84147098, 1.2959172 , 1.65901326, 1.81859485])
Loading...

Pripravimo še prikaz:

Prikažemo:

<Figure size 640x480 with 1 Axes>

Sestavljeno Simpsonovo pravilo

Interval [a,b][a, b] razdelimo na sodo število nn podintervalov enake širine h=(b−a)/nh=(b - a)/n, s čimer so definirana vozlišča xi=a+i hx_i=a+i\,h za i=0,1,…,ni=0,1,\dots,n. V tem primeru zapišemo sestavljeno Simpsonovo pravilo:

∫abf(x) dx=h3(f(x0)+4∑i=1n/2f(x2i−1)+2∑i=1n/2−1f(x2i)+f(xn))−b−a180h4 f(4)(η)⏟ESestavljeno Simpsonovo 1/3,\int_{a}^{b}f(x)\,\textrm{d}x= \frac{h}{3}\left( f(x_0) +4\sum_{i=1}^{n/2}f(x_{2i-1}) +2\sum_{i=1}^{n/2-1}f(x_{2i}) +f(x_n) \right) \underbrace{ -\frac{b-a}{180}h^4\,f^{(4)}(\eta) }_{E_{\textrm{Sestavljeno Simpsonovo 1/3}}} ,

kjer je η\eta neznana vrednost na intervalu [a,b][a, b]. Napaka je četrtega reda O(h4)\mathcal{O}(h^4).

Numerična implementacija:

Loading...

Pripravimo sliko:

Prikažemo:

<Figure size 640x480 with 1 Axes>
Boljša ocena integrala

Napaka sestavljene Simpsonove metode je definirana z:

ESestavljeno Simpsonovo 1/3=−b−a180h4 f(4)(η),E_{\textrm{Sestavljeno Simpsonovo 1/3}}= -\frac{b-a}{180}h^4\,f^{(4)}(\eta),

kjer je η\eta neznana vrednost na intervalu [a,b][a, b].

Izboljšano oceno integrala določimo na podoben način kakor pri sestavljeni trapezni metodi; integral II ocenjujemo pri dveh različnih korakih hh in 2 h2\,h, velja natančno:

∫abf(x) dx=Ih+Eh=I2h+E2h,\int_a^b f(x)\,\textrm{d}x = I_h + E_h = I_{2h} + E_{2h},

kjer je IhI_h približek integrala s korakom hh in EhE_h ocena napake pri koraku hh; analogno velja za I2hI_{2h} in E2hE_{2h}.

Če predpostavimo, da je f(4)(η)f^{(4)}\left (\eta \right ) v obeh primerih enak, lahko določimo razliko I2h−Ih=Eh−E2hI_{2h}-I_{h} = E_{h}-E_{2h}.

Naprej zapišemo:

Eh=−b−a180h4 f(4)(η)=h4 K.E_h=-\frac{b-a}{180}h^4\,f^{(4)}(\eta)=h^4\,K.

Ob predpostavki, da je f(4)(η)f^{(4)}\left (\eta \right ) pri koraku hh in 2h2h enak (η\eta je pri koraku hh in 2h2h dejansko različen), zapišemo:

E2h=−(b−a)180(2h)4 f(4)(η)=16 h4 KE_{2h}=-\frac{(b-a)}{180}(2h)^4\,f^{(4)}(\eta)=16\,h^4\,K

Sledi:

I2h−Ih=−15K h4.I_{2h}-I_h=-15K\,h^4.

Sedaj lahko ocenimo napako pri koraku hh:

Eh=h4 K=Ih−I2h15.E_h=h^4\,K=\frac{I_h-I_{2h}}{15}.

Na podlagi ocene napake lahko izračunamo boljši približek Ih∗I_{h}^*:

Ih∗=Ih+115 (Ih−I2h)I_h^* = I_h + \frac{1}{15}\,(I_{h}-I_{2h})

ali

Ih∗=1615 Ih−115 I2hI_h^* = \frac{16}{15}\,I_h - \frac{1}{15}\,I_{2h}
Numerični zgled

Predhodno smo s Simpsonovim pravilom že izračunali integral pri koraku h=0,5h=0,5 in pri koraku h=0,25h=0,25, rezultata sta bila:

Loading...

S pomočjo zgornje formule izračunamo boljši približek:

Točen rezultat:   1.4404224209802097
Boljši približek: 1.4404218714139077

Pridobimo boljši numerični približek, izgubimo pa oceno napake!

Simpsonova metoda v scipy.integrate.simpson

V scipy je implementirano sestavljeno Simpsonovo pravilo v scipy.integrate.simpson() (dokumentacija):

simpson(y, x=None, *, dx=1.0, axis=-1)

kjer so parametri:

  • y tabela funkcijskih vrednosti, ki jih integriramo,

  • x vozlišča, gre za opcijski parameter, če je x=None, se predpostavi ekvidistantne podintervale širine dx,

  • dx širina ekvidistantnih podintervalov oz korak integriranja,

  • axis os integriranja (pomembno v primeru večdimenzijskega numeričnega polja).

V starejših različicah SciPy se je funkcija imenovala simps in je imela še parameter even; oboje je bilo odstranjeno v SciPy 1.14.

Poglejmo si primer, najprej uvozimo funkcijo simpson:

Loading...

Rombergova metoda

Rombergova metoda temelji na Richardsonovi ekstrapolaciji. Predpostavimo, da integral ∫abf(x)dx\int_a^b f(x)\textrm{d}x integriramo na intervalu [a,b][a,b], ki ga razdelimo na 2n−12^{n-1} podintervalov (n=1,2,4,8,…n=1,2,4,8, \dots).

Rezultat trapeznega pravila pri n=1n=1 označimo z R1⏟n,1⏟jR_{\underbrace{1}_{n},\underbrace{1}_{j}}, pri čemer jj označuje natančnost pridobljenega rezultata O(h2j)\mathcal{O}(h^{2j}).

Če uporabimo trapezno integracijsko pravilo pri n=1,2,4…n=1,2,4 \dots podintervalih, izračunamo:

  • R1,1R_{1,1}, korak h1=hh_1=h, red natančnosti O(h12)\mathcal{O}(h_1^2),

  • R2,1R_{2,1}, korak h2=h/2h_2=h/2, red natančnosti O(h22)\mathcal{O}(h_2^2),

  • R3,1R_{3,1}, korak h3=h/4h_3=h/4, red natančnosti O(h32)\mathcal{O}(h_3^2),

  • R4,1R_{4,1}, korak h4=h/8h_4=h/8, red natančnosti O(h42)\mathcal{O}(h_4^2),

  • …\dots

  • Rn,1R_{n,1}, korak h4=h/(2n−1)h_4=h/(2^{n-1}), red natančnosti O(hn2)\mathcal{O}(h_n^2).

Na podlagi Richardsonove ekstrapolacije izračunamo boljši približek

  • R2,2=R2,1+13(R2,1−R1,1)R_{2,2} = R_{2,1} + \frac{1}{3}\left(R_{2,1}-R_{1,1}\right), korak h2=h/2h_2=h/2, red natančnosti O(h24)\mathcal{O}(h_2^4),

  • R3,2=R3,1+13(R3,1−R2,1)R_{3,2} = R_{3,1} + \frac{1}{3}\left(R_{3,1}-R_{2,1}\right), korak h3=h/4h_3=h/4, red natančnosti O(h34)\mathcal{O}(h_3^4),

  • …\dots

  • Rn,2=Rn,1+13(Rn,1−Rn−1,1)R_{n,2} = R_{n,1} + \frac{1}{3}\left(R_{n,1}-R_{n-1,1}\right), korak hn=h/(2n−1)h_n=h/(2^{n-1}), red natančnosti O(hn4)\mathcal{O}(h_n^4).

Nato nadaljujemo z Richardsonovo ekstrapolacijo:

  • R3,3=R3,2+115(R3,2−R2,2)R_{3,3} = R_{3,2} + \frac{1}{15}\left(R_{3,2}-R_{2,2}\right), korak h3=h/4h_3=h/4, red natančnosti O(h36)\mathcal{O}(h_3^6),

  • …\dots

  • Rn,3=Rn,2+115(Rn,2−Rn−1,2)R_{n,3} = R_{n,2} + \frac{1}{15}\left(R_{n,2}-R_{n-1,2}\right), korak hn=h/(2n−1)h_n=h/(2^{n-1}), red natančnosti O(hn6)\mathcal{O}(h_n^6).

Richardsonovo extrapolacijo lahko posplošimo:

  • Rn,j=Rn,j−1+14j−1−1(Rn,j−1−Rn−1,j−1)R_{n,j} = R_{n,j-1} + \frac{1}{4^{j-1}-1}\left(R_{n,j-1}-R_{n-1,j-1}\right), korak hn=h/(2n−1)h_n=h/(2^{n-1}), red natančnosti O(hn2j)\mathcal{O}(h_n^{2j})

Pri tem je boljši približek R2,2R_{2,2} pri koraku h/2h/2 enak rezultatu, ki ga dobimo po Simpsonovi metodi pri koraku h/2h/2. Podobno je boljši približek R3,2R_{3,2} pri koraku h/4h/4 enak numeričnemu integralu Simpsonove metode pri koraku h/4h/4. In je dalje R3,3R_{3,3} enak popravljenemu približku Simpsonove metode pri koraku h/4h/4.

Pripravimo numerične podatke:

Poglejmo si primer od zgoraj. Najprej s sestavljeno trapezno metodo izračunamo integral pri različnih korakih (drugi red napake):

Loading...

Nato izračunamo boljše približke (dobimo četrti red napake):

Loading...

Rezultati predstavljajo rezultat Simpsonove metode pri koraku h=0,5h=0,5, h=0,25h=0,25 in h=0.125h=0.125:

Loading...

Ponovno izračunamo boljše približke (dobimo šesti red napake):

Loading...

Rezultat predstavlja boljši rezultat Simpsonove pri koraku h=0,25h=0,25 in h=0.125h=0.125:

Loading...

Ponovno izračunamo boljše približke (dobimo osmi red napake):

Loading...

Rombergova metoda nam torej ponuja visoko natančnost rezultata za relativno majhno numerično ceno. Napako pa ocenimo:

E=∣Rn,n−Rn−1,n−1∣.E = \left|R_{n,n}-R_{n-1,n-1}\right|.
Rombergova metoda v scipy.integrate.romb

V scipy je implementirana Rombergova metoda v scipy.integrate.romb() (dokumentacija):

romb(y, dx=1.0, axis=-1, show=False)

kjer so parametri:

  • y tabela funkcijskih vrednosti, ki jih integriramo,

  • dx širina ekvidistantnih podintervalov oz korak integriranja,

  • axis os integriranja (pomembno v primeru večdimenzijskega numeričnega polja),

  • show če je True prikaže elemente Richardsonove ekstrapolacije.

Poglejmo si primer od zgoraj:

array([0.84147098, 1.01505104, 1.18623077, 1.34872795, 1.49624248, 1.62261343, 1.72197541, 1.78891084, 1.81859485])
Richardson Extrapolation Table for Romberg Integration
======================================================
 1.33003 
 1.41314  1.44084 
 1.43362  1.44045  1.44042 
 1.43872  1.44042  1.44042  1.44042 
======================================================
Loading...

Gaussov integracijski pristop

Newton-Cotesov pristop temelji na polinomu nn-te stopnje in napaka je n+1n+1 stopnje. To pomeni, da integracija daje točen rezultat, če je integrirana funkcija polinom stopnje nn ali manj; pri sodem nn zaradi simetrije celo stopnje n+1n+1 (Simpsonovo pravilo, n=2n=2, je npr. točno tudi za kubične polinome).

Gaussov integracijski pristop je v principu drugačen: cilj je integral funkcije f(x)f(x) nadomestiti z uteženo vsoto vrednosti funkcije pri diskretnih vrednostih f(xi)f(x_i):

∫abf(x) dx≈∑i=0n−1Ai f(xi).\int_a^bf(x)\,\textrm{d}x\approx \sum_{i=0}^{n-1} A_i\, f(x_i).

Pri tem je neznana utež AiA_i in tudi lega vozlišča xix_i. Za stopnje polinoma nn bomo potrebovali tudi več točk (xi,f(xi))(x_i, f(x_i)).

V nadaljevanju bomo spoznali, da lahko zelo učinkovito izračunamo numerično točen integral. Prednost Gaussove integracije je tudi, da lahko izračuna integral funkcij s singularnostmi (npr: ∫01sin⁡(x)/(x) dx\int_0^1\sin(x)/\sqrt{(x)}\,dx).

Gaussova kvadratura z enim vozliščem

Predpostavimo, da želimo integrirati polinom stopnje n=1n=1 (linearna funkcija):

f(x)=P1(x)=a0+a1 x.f(x)=P_1(x)=a_0+a_1\,x.

Izračunajmo:

∫xLxDP1(x) dx=(a0 x+a1 x22)xLxD=−a0 xL+a0 xD−a1 xL22+a1 xD22.\int_{x_L}^{x_D}P_1(x)\,\textrm{d}x=\left(a_0\,x+a_1\,\frac{x^2}{2}\right)_{x_L}^{x_D}=-a_0\,x_L+a_0\,x_D-\frac{a_1\,x_L^2}{2}+\frac{a_1\,x_D^2}{2}.

Po drugi strani pa želimo integral izračunati glede na ustrezno uteženo A0A_0 vrednost funkcije f(x0)f(x_0) v neznanem vozlišču x0x_0 (samo eno vozlišče!):

∫xLxDP1(x) dx=A0 P1(x0)=A0 a0+A0 a1 x0.\int_{x_L}^{x_D}P_1(x)\,\textrm{d}x = A_0\,P_1(x_0)= A_0\,a_0+A_0\,a_1\,x_0.

Z enačenjem zgornjih izrazov izpeljemo:

−a0 xL+a0 xD−a1 xL22+a1 xD22=A0 a0+A0 a1 x0.-a_0\,x_L+a_0\,x_D-\frac{a_1\,x_L^2}{2}+\frac{a_1\,x_D^2}{2}=A_0\,a_0+A_0\,a_1\,x_0.

a0a_0 in a1a_1 sta koeficienta linearne funkcije, ki lahko zavzame poljubne vrednosti, zato velja:

a0 (−xL+xD−A0)=0ina1(−xL22+xD22−A0 x0)=0.a_0\,\left(-x_L+x_D-A_0\right)=0\qquad\textrm{in}\qquad a_1\left(-\frac{x_L^2}{2}+\frac{x_D^2}{2}-A_0\,x_0\right)=0.

Gre za sistem linearnih enačb z rešitvijo:

A0=xD−xL,x0=xL+xD2.A_0= x_D-x_L, \qquad x_0=\frac{x_L+x_D}{2}.

Če je integrirana funkcija linearna, bomo samo na podlagi vrednosti v eni točki izračunali pravo vrednost!

Da je Gaussov integracijski pristop neodvisen od mej integriranja xLx_L, xDx_D, pa uvedemo standardne meje.

Standardne meje: xL=−1x_L=-1 in xD=1x_D=1

Zaradi splošnosti meje x∈[xL,xD]x\in[x_L, x_D] transformiramo v ξ∈[−1,+1]\xi\in[-1, +1] s pomočjo:

x=xD+xL2+xD−xL2ξx=\frac{x_D+x_L}{2}+\frac{x_D-x_L}{2}\xi

in

dx=xD−xL2dξ.\textrm{d}x=\frac{x_D-x_L}{2}\textrm{d}\xi.

Velja:

∫xLxDf(x) dx=∫−11g(ξ) dξ,\int_{x_L}^{x_D}f(x)\,\textrm{d}x=\int_{-1}^1 g\left(\xi\right)\,\textrm{d}\xi,

kjer je:

g(ξ)=xD−xL2 f(xL+xD2+xD−xL2ξ).g(\xi)=\frac{x_D-x_L}{2}\,f\left(\frac{x_L+x_D}{2}+\frac{x_D-x_L}{2}\xi\right).

V primeru standardnih mej, je pri eni Gaussovi točki utež A0=2A_0=2 in x0=0x_0=0 vrednost, pri kateri moramo izračunati funkcijo f(x0)f(x_0).

Strojno izpeljevanje uteži in Gaussove točke

Definirajmo simbole in nastavimo enačbo:

Loading...

Pripravimo dve enačbi (za prvo predpostavimo a0=0,a1=1a_0=0, a_1=1, za drugo predpostavimo a0=1,a1=0a_0=1, a_1=0) ter rešimo sistem za A_0 in x_0:

Loading...

Za dodatno razlago priporočam video posnetek.

Gaussova integracijska metoda z več vozlišči

Izpeljati želimo Gaussovo integracijsko metodo, ki bo upoštevala na intervalu [a,b][a,b] vv vozlišč in bo točno izračunala integral polinomov do stopnje n=2v−1n=2v-1. Veljati mora:

∫abP2v−1(x) dx=∑i=0v−1Ai P2v−1(xi).\int_a^bP_{2v-1}(x)\,\textrm{d}x = \sum_{i=0}^{v-1} A_i\,P_{2v-1}(x_i).

Pri izpeljavi se bomo omejili na standardne meje xL=−1x_L=-1, xD=1x_D=1,

kjer je polinom stopnje n=2v−1n=2v-1 definiran kot:

P2v−1(x)=∑i=02v−1ai xi.P_{2v-1}(x)=\sum_{i=0}^{2v-1} a_i\,x^i.

Z dvema Gaussovima točkama/vozliščema točno izračunamo integral polinoma do tretjega reda, s tremi Gaussovimi vozlišči pa točno izračunamo integral polinoma do petega reda!

Strojno izpeljevanje

Pripravimo si najprej simbolni zapis polinoma in ustreznih spremenljivk:

Sedaj pa poiščimo uteži AiA_i in vozlišča xix_i za primer dveh Gaussovih vozlišč; polinom je torej tretje stopnje.

Vozlišča: (x0, x1)
Uteži:    (A0, A1)

Polinom:

Loading...

Podobno kakor zgoraj za eno vozlišče, tukaj definirajmo enačbe:

Loading...

Rešimo jih za neznane xix_i in AiA_i:

Loading...

Določili smo seznam dveh (enakih) rešitev.

Najprej sta definirani vozlišči: x0=−3/3x_0=-\sqrt{3}/3 in x1=3/3x_1=\sqrt{3}/3, katerima pripadata uteži A0=A1=1A_0=A_1=1.

Koda zgoraj je izpeljana v splošnem - število vozlišč v lahko povečate ter izračunate vozlišča ter pripadajoče uteži.

Spodaj je podana tabela vozlišč in uteži za eno, dve in tri vozlišča (za meje a=−1a=-1, b=1b=1):

Število točk 1:

iiVozlišče xix_iUtež AiA_i
002

Število točk 2:

iiVozlišče xix_iUtež AiA_i
0−33-\frac{\sqrt{3}}{3}1
1+33+\frac{\sqrt{3}}{3}1

Število točk 3:

iiVozlišče xix_iUtež AiA_i
0−155-\frac{\sqrt{15}}{5}59\frac{5}{9}
1089\frac{8}{9}
2155\frac{\sqrt{15}}{5}59\frac{5}{9}

Za več vozlišč in tudi oceno napake, glejte Mathworld Legendre-Gauss Quadrature.

Za primer treh Gaussovih točk numerični integral izračunamo (standardne meje):

IGauss3=59 f(−155)+89 f(0)+59 f(155).I_{\textrm{Gauss3}}= \frac{5}{9}\,f\left(-\frac{\sqrt{15}}{5}\right) + \frac{8}{9}\,f\left(0\right)+\frac{5}{9}\,f\left(\frac{\sqrt{15}}{5}\right).
Numerična implementacija

Numerična implementacija (vključno s transformacijo mej) za eno, dve ali tri vozlišča:

Poglejmo si zgled. Najprej definirajmo funkcijo, ki jo želimo integrirati:

Sedaj pa funkcijo (v konkretnem primeru f) in ne vrednosti (npr. f(0.)) posredujemo funkciji Gaussova. Najprej za eno vozlišče, nato dve in tri:

Loading...
Loading...
Loading...
scipy.integrate.fixed_quad

Znotraj scipy je Gaussova integracijska metoda implementirana v okviru funkcije scipy.integrate.fixed_quad() (dokumentacija):

fixed_quad(func, a, b, args=(), n=5)

kjer so parametri:

  • func je ime funkcije, ki jo kličemo,

  • a je spodnja meja,

  • b je zgornja meja,

  • args je terka morebitnih dodatnih argumentov funkcije func,

  • n je število vozlišč Gaussove integracije, privzeto n=5.

Funkcija vrne terko z rezultatom integriranja val in vrednost None: (val, None)

Poglejmo primer od zgoraj:

Loading...

Rezultat je enak predhodnemu:

Loading...

scipy.integrate

scipy.integrate je močno orodje za numerično integriranje (glejte dokumentacijo). V nadaljevanju si bomo pogledali nekatere funkcije.

Integracijske funkcije, ki zahtevajo definicijsko funkcijo:

  • quad(func, a, b[, args, full_output, ...]) izračuna določeni integral func(x) v mejah [a, b],

  • dblquad(func, a, b, gfun, hfun[, args, ...]) izračuna določeni integral func(x,y),

  • tplquad(func, a, b, gfun, hfun, qfun, rfun) izračuna določeni integral func(x,y,z),

  • nquad(func, ranges[, args, opts, full_output]) izračuna določeni integral nn dimenzijske funkcije func( ...),

scipy.integrate.quad

Poglejmo si zelo uporabno funkcijo za integriranje, scipy.integrate.quad() (dokumentacija):

quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08, epsrel=1.49e-08, limit=50, 
     points=None, weight=None, wvar=None, wopts=None, maxp1=50, limlst=50)

Izbrani parametri so:

  • func Python funkcija, ki jo integriramo,

  • a spodnja meja integriranja (lahko se uporabi np.inf za mejo v neskončnosti),

  • b zgornja meja integriranja (lahko se uporabi np.inf za mejo v neskončnosti),

  • full_output za prikaz vseh rezultatov, privzeto 0,

  • epsabs dovoljena absolutna napaka,

  • epsrel dovoljena relativna napaka.

Poglejmo primer od zgoraj:

Loading...
scipy.integrate.dblquad

Gre za podobno funkcijo kot quad, vendar za integriranje po dveh spremenljivkah (dokumentacija). Funkcija scipy.integrate.dblquad() izračuna dvojni integral func(y, x) v mejah od x = [a, b] in y = [gfun(x), hfun(x)].

dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)

Izbrani parametri so:

  • func je Python funkcija, ki jo integriramo,

  • a je spodnja meja integriranja x (lahko se uporabi np.inf za mejo v neskončnosti),

  • b je zgornja meja integriranja x (lahko se uporabi np.inf za mejo v neskončnosti),

  • gfun je Python funkcija, ki definira spodnjo mejo y v odvisnosti od x,

  • hfun je Python funkcija, ki definira zgornjo mejo y v odvisnosti od x.

Poglejmo primer izračuna površine polkroga s polmerom 1:

∫−11(∫01−x21 dy) dx=π2\int_{-1}^{1}\left(\int_0^{\sqrt{1-x^2}}1\,\textrm{d}y\right)\,\textrm{d}x=\frac{\pi}{2}

Definirajmo ustrezne Python funkcije in izračunajmo rezultat:

Loading...

Integracijske funkcije, ki zahtevajo tabelo vrednosti:

  • trapezoid(y[, x, dx, axis]) sestavljeno trapezno pravilo,

  • cumulative_trapezoid(y[, x, dx, axis, initial]) kumulativni integral podintegralske funkcije (vrne rezultat v vsakem vozlišču),

  • simpson(y[, x, dx, axis]) Simpsonova metoda,

  • romb(y[, dx, axis, show]) Rombergova metoda.

Tukaj si bomo na primeru ogledali funkcijo cumulative_trapezoid. Oglejmo si primer, ko na maso m=1m=1 (enote izpustimo) deluje sila F=sin⁡(t)F=\sin(t). Iz 2. Newtonovega zakona sledi: F=m x¨F=m\,\ddot x. Pospešek integriramo, da izračunamo hitrost; nato integriramo še enkrat za pomik. Definirajmo najprej funkcijo za pospešek:

Zanima nas dogajanje v času 3 sekund:

Izračunajmo tabelo pospeškov ter nato integrirajmo za hitrost (pri tem je pomembno, da definiramo začetno vrednost):

Hitrost sedaj še enkrat integrirajmo, da izračunamo pot:

Prikažimo rezultat:

<Figure size 640x480 with 1 Axes>

Vprašanja za vaje


Vprašanje 1: Z uporabo orodij paketa sympy simbolno določite vrednost statičnega momenta prereza v obliki četrtine kroga na sliki:

Sxx=∫Ay dA=∫0r∫0π/2y(φ) r dφ dr=∫0π/2r33 sin⁡(φ) dφS_{xx} = \int_{A}y~\text{d}A=\int_0^r \int_0^{\pi/2}y(\varphi)~r~\text{d}\varphi~\text{d}r = \int_{0}^{\pi/2}\frac{r^3}{3}\, \sin (\varphi)\, \text{d}\varphi

Pripravite tudi numerično funkcijo odvisnosti integranda f(φ)=(r33 sin⁡(φ))f(\varphi) = \Big(\frac{r^3}{3}\, \sin (\varphi) \Big) pri podani vrednosti polmera RR.

Podatki:

R=7.5R = 7.5 mm

Vprašanje 2: Uporabite numerično funkcijo, pripravljeno pri prejšnji nalogi, in izračunajte ter grafično prikažite vrednosti integranda iz prve naloge (f(φ)=r33sin⁡(φ))\Big(f(\varphi) = \frac{r^3}{3}\sin (\varphi) \Big) pri 100 diskretnih točkah na intervalu φ∈[0,π/2]\varphi \in [0, \pi/2].

Izračunajte vrednost določenega integrala SS še numerično, s pomočjo trapezne in Simpsonove 1/3 metode iz paketov numpy oziroma scipy.

S=∫0π/2r33sin⁡(φ)dφS = \int_{0}^{\pi/2}\frac{r^3}{3}\sin (\varphi)\text{d}\varphi

Trapezno pravilo

Vprašanje 3: Z uporabo lastne implementacije trapeznega pravila (osnovnega, ne sestavljenega) izračunajte določeni integral

I=∫02−0.5x3−x2+8 dxI = \int_{0}^{2} -0.5x^3 - x^2 + 8 ~\text{d}x

Dobljeno vrednost primerjajte z rezultatom funkcije numpy.trapezoid (ali scipy.integrate.trapezoid), kjer opazovan interval razdelite na 10 ekvidistantnih odsekov.


Izboljšan približek z Richardsonovo ekstrapolacijo:

Iˉ=4Ih−I2h3\bar{I} = \frac{4I_h - I_{2h}}{3}

Vprašanje 4 : Uporabite Richardsonovo ekstrapolacijo in določite natančnejšo vrednost integrala iz prejšnje naloge tako, da opazovan interval x∈[0,2]x \in [0, 2] najprej razdelite na 2, nato še na 4 ekvidistantne segmente in uporabite sestavljeno trapezno metodo iz paketa numpy.


Simpsonovo 1/3 pravilo

Vprašanje 5: Določen integral iz prejšnje naloge izračunajte z lastno kodo Simpsonove 1/3 metode (osnovne, ne sestavljene).

I=∫02−0.5x3−x2+8 dxI = \int_{0}^{2} -0.5x^3 - x^2 + 8 ~\text{d}x

Dobljeno vrednost primerjajte z rezultatom funkcije scipy.integrate.simpson, kjer opazovan interval razdelite na 7 ekvidistantnih točk.


Vprašanje 6: Podane so izmerjene vrednosti pospeška avtomobila v smeri vožnje v času. Z uporabo kumulativne trapezne metode (scipy.integrate.cumulative_trapezoid) določite vrednosti hitrosti in opravljene poti avtomobila v opazovanem časovnem intervalu.

Avto pri času t=0t = 0 miruje (namig: argument initial).


Gaussova integracijska metoda (Gaussova kvadratura)

Vprašanje 7: Z uporabo sestavljene trapezne metode iz scipy in metode Gaussove integracije (scipy.integrate.quad) izračunajte vrednosti integralov:

I1=∫01sin⁡(x)xdxI_1 = \int_{0}^{1}\frac{\sin(x)}{x} \text{d}x
I2=∫12sin⁡(x)xdxI_2 = \int_{1}^{2}\frac{\sin(x)}{x} \text{d}x
I3=∫−0.50.5sin⁡(x)xdxI_3 = \int_{-0.5}^{0.5}\frac{\sin(x)}{x} \text{d}x

Pri uporabi trapezne metode razdelite opazovan interval na 10 točk.

Vprašanje 8: Integral:

I=∫−0.50.5sin⁡(x)xdxI = \int_{-0.5}^{0.5}\frac{\sin(x)}{x} \text{d}x

izračunajte še z uporabo funkcije scipy.integrate.fixed_quad, ki ji lahko podamo tudi parameter števila vozlišč pri integraciji, n. Najprej uporabite integracijo z enim vozliščem, nato z dvema in nazadnje še s tremi vozlišči.