MATLAB - całkowanie Funkcja pierwotna, całka oznaczona na podstawie funkcji pierwotnej Do uzyskania funkcji pierwotnej służy polecenie int. Jest wiele możliwości jego użycia. Zobaczmy, kiedy wykonuje się prawidłowo, a kiedy nie (podane zostaną tylko niektóre warianty). Aby się w pełni przekonać, najlepiej wykonywać polecenia pojedynczo. int(x^2) % nie działa program nie wie, czym jest x x=3; % zdefiniowaliśmy zmienną x, nadaliśmy jej wartość int(x^2) % nie działa int nie może być stosowane do zwykłych zmiennych clear x % usuwamy zmienną x, spróbujemy inaczej int('x^2') % działa, ale Matlab sugeruje inny zapis int(sym('x^2')) % działa poprawnie int(sym('x^2+3*sin(5*x)')) % działa poprawnie Zatem pierwszy działający sposób można opisać następująco: int(sym('tu jakaś funkcja podcałkowa argumentu x')) takie podejście działa niezależnie, czy x jest jakkolwiek zdefiniowane, czy nie. Użycie funkcji sym zapewnia, prawidłową definicję wyrażenia symbolicznego - nie służącego do obliczenia konkretnej wartości, a do ogólnych obliczeń, sprawdź: x=3; int(sym('x^2+3*sin(5*x)')) % powyższa definicja nie miała wpływu na wynik Pamiętajmy, że jeśli wyrażenie podcałkowe będzie skomplikowane, nie uda się znaleźć funkcji pierwotnej, patrz np.: int(sym('exp(sin(log(x)))')) A teraz drugi sposób: zdefiniujemy x jako zmienną symboliczną, możemy to zrobić, pisząc x=sym('x') albo syms x Teraz wyrażenia zawierające x będą traktowane jako wyrażenia symboliczne int(wyrażenie zawierające x) int(x^2) % działa int(x^2+3*sin(5*x)) %
int(sym('x^2+3*sin(5*x)')) % nadal działa, sposób niezależny od definicji x Jeśli x jest zdefiniowane jako symboliczne, możemy zdefiniować kolejną zmienną, która będzie reprezentować funkcję podcałkową: syms x z=x^7+cos(x); int(z) Trzeci sposób funkcja podcałkowa zdefiniowana w pliku Tworzymy i zapisujemy plik z definicją funkcji podcałkowej function wynik=funcalk1(x) wynik=x^2+sin(x); Jeśli x jest zdefiniowane jako symboliczne, możemy napisać int(funcalk1(x)) % Niezależnie od tego, czy i jak jest zdefiniowane x, dla funkcji z pliku nie zadziała wariant pierwszy (choć działa dla funkcji standardowych, takich jak sin(x) czy exp(x)): int(sym('funcalk1(x)')) % Czwarty sposób funkcja podcałkowa zdefiniowana anonimowo Tworzymy funkcję anonimową funcalk2=@(x) x^5+exp(x); Dla x symbolicznego zadziała int(funcalk2(x)) % Podobnie jak dla funkcji plikowych nie zadziała int(sym('funcalk2(x)')) % Teraz sprawdźmy, co w przypadku, gdy funkcja podcałkowa plikowa lub anonimowa, jest funkcją większej liczby zmiennych. Tworzymy funkcję plikową function wynik=funcalk3(x,n) wynik=x^2+n*x;
Oba argumenty definiujemy jako symboliczne syms x n Sprawdźmy: int(funcalk3(x,n)) % całkowanie względem x int(funcalk3(x,n),x) % całkowanie względem x int(funcalk3(x,n),n) % całkowanie względem n Zatem drugi argument funkcji int określa zmienną, względem której całkujemy. Domyślnie u nas jest nią x. Przećwiczmy to samo dla funkcji anonimowej. syms x y funcalk4=@(x,y) x*y^2; int(funcalk4(x,y)) % całkowanie względem x int(funcalk4(x,y),x) % całkowanie względem x int(funcalk4(x,y),y) % całkowanie względem y Jeśli uda się znaleźć funkcję pierwotną, pozostaje tylko dopisać w funkcji int granice całkowania i można obliczyć całkę oznaczoną. Obliczmy kilka całek (powyższe definicje funkcji i zmiennych symbolicznych nadal obowiązują): int(sym('x^2+x'),0,2) int(funcalk1(x),0,2) int(funcalk2(x),0,1) int(funcalk3(x,n),0,2) int(funcalk3(x,n),x,0,2) int(funcalk3(x,n),n,0,2) int(funcalk3(x,3),x,0,2) int(funcalk4(x,y),1,2) Całka oznaczona obliczana numerycznie Jeśli znalezienie funkcji pierwotnej nie jest możliwe, pozostaje całkowanie numeryczne, znów poznamy kilka sposobów opartych na funkcji quad, korzystanie z niej jest podobne jak dla fzero. Sposób pierwszy quad('wyrazenie',a,b) wynikiem będzie całka z wyrażenia podcalkowego jako funkcji x w granicach od a do b; wyrażenie definiujemy dla zmiennej x, może ono zawierać standardowe funkcje jak sin(x), funkcje z pliku, ale nie funkcje anonimowe. W definicji funkcji podcałkowej operator potęgowania czynnika zależnego
od x, oraz operatory mnożenia lub dzielenia czynników zależnych od x piszemy z kropką. Jest tak dlatego, ponieważ obliczenia numeryczne odbywają się na konkretnym wektorze z węzłami z przedziału całkowania. Wartości funkcji obliczane są dla konkretnych węzłów, elementów tego wektora. quad('x.^2',0,2) % nie zadziała dla 'x^2' quad('x.^2 + 2*x.*sin(x)',0,2) przykład z funkcją z pliku function wynik=funcalk1(x) wynik=x.^2; % jeśli nie będzie kropki, quad nie zadziała quad('x.^2 + 2*x.*sin(x)+funcalk1(x)',1,2) przykład z funkcją anonimową funcalk2=@(x) cos(x); quad('x.^2 + 2*x.*sin(x)+funcalk2(x)',1,2) % nie zadziała Sposób drugi quad(@funkcja,a,b) funkcją (pisaną bez argumentu) może być standardowa funkcja matematyczna, lub funkcja z pliku. Zakładamy, że nadal mamy zdefiniowane funkcje funcalk1(x) plikowa i funcalk2(x) anonimowa. quad(@sin,0,pi) quad(@funcalk1,0,pi) % działa quad(@funcalk2,0,pi) % nie działa Jeśli chcemy bezpośrednio całkować funkcję anonimową, piszemy jej nazwę bez znaku @: quad(sin,0,pi) % nie działa quad(funcalk1,0,pi) % nie działa quad(funcalk2,0,pi) % działa Sposób trzeci, najbardziej uniwersalny quad(@(x) wyrazenie podcałkowe,a,b) wyrażenie podcałkowe może zawierać zarówno funkcje plikowe jak i anonimowe. Zakładamy, że nadal mamy zdefiniowane funkcje funcalk1(x) plikowa i funcalk2(x) anonimowa.
quad(@(x) x.^2,0,pi) quad(@(x) x.^2+sin(x).*exp(x),0,pi) quad(@(x) x.^2+sin(x).*exp(x)+funcalk1(x),0,pi) quad(@(x) x.^2+sin(x).*exp(x)+funcalk2(x),0,pi) quad(@(x) funcalk1(x).*funcalk2(x),0,pi) Zdefiniujmy plikową funkcję dwóch zmiennych function wynik=funcalk3(x,n) wynik=x.^2+n.*x; % dla quad muszą być kropki Numerycznie możemy obliczyć całkę z tej funkcji względem x tylko dla ustalonych wartości n: quad(@(x) funcalk3(x,0),0,pi) % n=0 quad(@(x) funcalk3(x,5),0,pi) % n=5 Możemy też obliczyć całkę względem n przy ustalonym x (dla funkcji quad formalnie zmienną całkowania pozostaje x, ale my zamieniamy sens argumentów funkcji funcalk3): quad(@(x) funcalk3(0,x),0,1) % x=0 quad(@(x) funcalk3(1,x),0,1) % x=1 albo prościej definiując wyrażenie podcałkowe jako funkcję n (bez potrzeby zamiany sensu argumentów), całkowanie też odbędzie się względem n quad(@(n) funcalk3(0,n),0,1) % x=0 quad(@(n) funcalk3(1,n),0,1) % x=1 Analogicznie będzie dla funkcji anonimowej: funcalk4=@(x,y) x.*y.^2; quad(@(x) funcalk4(x,0),0,1) % y=0 quad(@(x) funcalk4(x,5),0,1) % y=5 quad(@(x) funcalk4(0,x),0,1) % x=0 quad(@(x) funcalk4(1,x),0,1) % x=1 quad(@(y) funcalk4(0,y),0,1) % x=0 quad(@(y) funcalk4(1,y),0,1) % x=1
Zadania 1. Oblicz całkę 5 2 x+1sin(x 2 )ln(x+1)dx. 0 2. Stwórz 5-składnikowy wektor A, poszczególne elementy mają wartości L A n = sin( n π x ) 0 L (xl x2 )dx. Obliczenia wykonać dla L = 2. Rozwiązania (przykładowe sposoby): 1. quad(@(x) sqrt(2*x+1).*sin(x.^2).*log(x+1),0,5) 2. fun=@(x,n) sin(n*pi*x/2).*(2*x-x.^2); for n=1:5 A(n)=quad(@(x) fun(x,n),0,2); A