Python

Projekt – Wielomiany Lagrange’a (Python)

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

wykresON.png

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *