Omówienie przygotowania do rozwiązywania zadań
Przedstawiony poniżej raport był jednym z projektów przesłanych w ramach zadania zaliczeniowego na kurs Obliczenia Naukowe realizowany na studiach inżynierskich na kierunku Matematyka Stosowana o specjalizacji Analiza Danych.
Pełne rozwiązanie wraz z opisami znajduje się tutaj.
Rozwiązanie w notatniku dla programu Python znajuduje się tutaj.
Na wstępie należy zaimportować potrzebne do rozwiązywania zadań pakiety (tj. sypmy, numpy, matplotlib) oraz zdefiniować ‘x’ jako symbol komendą „x=sm.symbols(‘x’)”.
Wielomian Legendre’a (obliczanie symboliczne) definiujemy w Pythonie w następujący sposób:
def funkcja(n):
return sm.simplify((1/((2**n)*sm.factorial(n))) * sm.diff((x**2-1)**n,x,n))
Zad. 1. Należy obliczyć symbolicznie wielomiany Legendre’a dla wartości 8 i 11, aby to zrobić, trzeba wypisać zdefiniowaną wcześniej funkcję funkcja(n) dla n=8 oraz n=11(za n podstawić odpowiednią liczbę).
print(’Obliczenie symboliczne P(8): ’, funkcja(8))
print(’Obliczenie symboliczne P(11): ’, funkcja(11))
Otrzymujemy następujące wyniki:
Obliczenie symboliczne P(8): 6435*x**8/128 – 3003*x**6/32 + 3465*x**4/64 – 315*x**2/32 + 35/128 Obliczenie symboliczne P(11): x*(88179*x**10 – 230945*x**8 + 218790*x**6 – 90090*x**4 + 15015*x**2 – 693)/256
Wielomian został obliczony symbolicznie za pomocą funkcji sympy simplify.
Zad. 2. Należało zweryfikować, czy wielomian spełnia równanie różniczkowe
d/ dx((1−x^2)P0 n(x))+ n(n +1)Pn(x) = 0
dla odpowiednich n. Aby rozwiązać to zadanie trzeba zapisać w języku pyton podane równanie różniczkowe i je zdefiniować.
def rownanie(n):
return sm.diff((1-x**2)*funkcja(n).diff(x),x)+n*(n+1)*funkcja(n)
Następnie należy porównać wynik równania dla odpowiednich n (tu dla n=30 oraz n=200, w tym celu należy za n podstawić odpowiednie liczby) z wynikiem w zadaniu:
if sm.simplify(rownanie(30)) == 0:
print(’Dla n = 30 Pn spełnia równanie różniczkowe’)
else:
print(’Dla n = 30 Pn nie spełnia równania różniczkowego’)
if sm.simplify(rownanie(200)) == 0:
print(’Dla n = 200 Pn spełnia równanie różniczkowe’)
else:
print(’Dla n = 200 Pn nie spełnia równania różniczkowego’)
Wynik, który zwraca nam Python wygląda następująco:
Dla n = 30 Pn spełnia równanie różniczkowe
Dla n = 200 Pn spełnia równanie różniczkowe
Z rozwiązania wynika, że obie podane liczby spełniają zadane równanie różniczkowe.
Zad. 3. Aby sprawdzić, czy dla każdego n <= 30 wielomiany Pn należą do przestrzeni L^2[-1,1] – całki oznaczonej od -1 do 1 z |f(x)|^2 mniejszej od nieskończoności, musimy napisać odpowiednią funkcję:
#Ad.3.
T=[]
for n in range(0,30):
L = sm.simplify(sm.integrate(funkcja(n)**2,(x,-1,1)))
T.append(L)
A=0
for i in range(len(T)):
if T[i] < sm.oo:
A=A+1
if A==30:
print(„Należy do przestrzeni”)
else:
print(„Nie należy do przestrzeni”)
Wypisuje zwrot : Należy do przestrzeni
Wniosek – dla wszystkich n<=30 wielomiany Pn należą do przestrzeni L^2[-1,1].
Zad. 4. Należy napisać funkcję symboliczną, która dla podanej liczby dodatniej, całkowitej k wygeneruje macierz k x k, która w miejscu (i,j) będzie miała wyraz <Pi,Pj>.
Dla liczby k=15 (aby podać inną liczbę należy na początku kodu przy definiowaniu k podać inną liczbę):
k = 15
A = [[0 for i in range(k)] for j in range(k)]
for i in range(0,k):
for j in range(0,k):
A[i][j] = sm.simplify(sm.integrate(funkcja(i)*funkcja(j),(x,-1,1)))
for i in range(k):
print(” „.join(map(str, A[i])))
W ten sposób otrzymujemy poniższą macierz diagonalną.
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 2/3 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 2/5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2/7 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2/9 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2/11 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2/13 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 2/15 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 2/17 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2/19 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2/21 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 2/23 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 2/25 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 2/27 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 2/29
Zad. 5. Należy narysować wykres wielomianu Pn (4) w przedziale [-1,1] wykorzystując obliczenia numeryczne.
W tym celu trzeba zaimportować numpy i matplotlib.pyplot
import numpy as np
import matplotlib.pyplot as plt
Następnie należy rozpocząć rysowanie, opisać osie X i Y oraz pokazać funkcję na wykresie
plt.figure()
funkcja2=funkcja(4)
X = np.linspace(-1,1,1000)
Y = []
for i in range(0,1000):
Y.append(funkcja2.subs(x,X[i]))
plt.plot(X,Y,’r’)
plt.show()
Wykres, który otrzymaliśmy prezentuje się następująco