<jupyter_start><jupyter_text>Calcul Numeric - Tema 4<jupyter_code>import numpy as np
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>Calculul derivatei unei funcțiiFuncția dată este$f(x) = \cos (-0.7 x)$.Derivata a doua a lui $f$ (calculată simbolic) este$f''(x) = -0.49 \cdot \cos(0.7 x)$, unde$x \in \left[- \frac{\pi}{2}, \pi\right]$.<jupyter_code>left, right = -np.pi / 2, np.pi

def f(x):
    return np.cos(-0.7 * x)

def f_second_derivative(x):
    return -0.49 * np.cos(0.7 * x)<jupyter_output><empty_output><jupyter_text>Construim un interval discretizat cu $N = 212$ puncte echidistante. Am determinat experimental că această valoare este cel mai mic $N$ pentru care eroarea de trunchiere este sub $10^{-5}$.<jupyter_code>N = 212
x = np.linspace(left, right, N)<jupyter_output><empty_output><jupyter_text>Pentru calcularea derivatei a doua în interiorul intervalului folosesc metoda diferențelor finite centrale.<jupyter_code>def f_computed_second_derivative(x):
    h = x[1] - x[0]
    y = f(x)
    y2 = np.zeros(len(y) - 2)
   
    for i in range(1, len(x) - 1):
        y2[i - 1] = (y[i + 1] - 2 * y[i] + y[i - 1]) / (h * h)

    return y2<jupyter_output><empty_output><jupyter_text>Reprezentarea grafică a rezultatului<jupyter_code>x_interior = x[1:-1]

y_real = f_second_derivative(x_interior)
y_approx = f_computed_second_derivative(x)

plt.figure(dpi=120)
plt.suptitle('Aproximarea derivatei a II-a')
plt.plot(x_interior, y_real, label='rezultat simbolic')
plt.plot(x_interior, y_approx, label='rezultat numeric')
plt.legend()
plt.show()
error = np.abs(y_approx - y_real)

plt.figure(dpi=120)
plt.suptitle('Eroarea de trunchiere')
plt.plot(x_interior, error)
plt.hlines([1e-5], xmin=left, xmax=right, color='red')
plt.show()

print('Valoarea maximă a erorii:', np.max(error))<jupyter_output><empty_output><jupyter_text>Integrare prin formule de cuadratură sumate  Funcția care calculează valoarea aproximativă a integralei<jupyter_code>def integrare(f, x, metoda):
    # Evaluăm funcția în punctele date
    y = f(x)

    h = x[1] - x[0]
    
    if metoda == 'dreptunghi':
        I = 2 * h * np.sum(y[::2])
    elif metoda == 'trapez':
        I = h/2 * (y[0] + 2 * np.sum(y[1:-2]) + y[-1])
    elif metoda == 'simpson':
        I = h/3 * (y[0] + 4 * np.sum(y[1:-1:2]) + 2 * np.sum(y[2:-1:2]) + y[-1])
    else:
        raise Exception('Metodă necunoscută')

    return I<jupyter_output><empty_output><jupyter_text>Reprezentare grafică Am folosit funcția de mai sus pentru a calcula integrala funcției $f$ la diferite grade de precizie. Am făcut un grafic pe care arăt cât de repede converg la o valoare diferitele metode.<jupyter_code>left, right = -16, 16
sigma = 1.6
f = lambda x: 1/(sigma * np.sqrt(2 * np.pi)) * np.exp(-(x ** 2) / (2 * (sigma ** 2)))

N_min = 3
N_max = 20
N_range = range(N_min, N_max, 2)

def eval_metoda(metoda):
    valori_integrala = []
    for N in N_range:
        x = np.linspace(left, right, N)
        I = integrare(f, x, metoda)
        valori_integrala.append(I)
    return valori_integrala

plt.figure(dpi=120)
plt.suptitle('Aproximarea valorii integralei folosind diferite formule de cuadratură')
plt.plot(N_range, eval_metoda('dreptunghi'), label='Dreptunghi')
plt.plot(N_range, eval_metoda('trapez'), label='Trapez')
plt.plot(N_range, eval_metoda('simpson'), label='Simpson')
plt.hlines([1], xmin=N_min, xmax=N_max - 1, linestyle='--', color='red')
plt.legend()
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14982778415614237, 'fraction_numerical': 0.025545350172215844, 'mean_word_length': 4.378086419753086, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '622992', 'license': 'MIT', 'n_tokens_mistral': 1524, 'n_tokens_neox': 1458, 'n_words': 324, 'path': 'cn/teme/Majeri_Gabriel_332_Tema4.ipynb', 'repo_name': 'FloaterTS/teme-fmi', 'size': '3484'}