Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab1

.py
Скачиваний:
0
Добавлен:
27.08.2024
Размер:
2.85 Кб
Скачать
import matplotlib.pyplot as plt
import math
import random as rd
from scipy.integrate import quad
import pandas as pd


def plot_ft():
    """Построение графика функции F(t)"""
    x=[0]
    y=[]
    while max(x)<=3:
        if(max(x)<1):
            y.append(round(16/(max(x)+1),2))
        elif((max(x)>=1)and(max(x)<=2)):
            y.append(round(8*math.sin(2*math.pi*(max(x)-1))+8,2))
        elif(max(x)>2):
            y.append(round(8-32*((max(x)-2)**2),2))
        x.append(round(max(x)+0.1,2))
    del x[-1]
    plt.plot(x,y)
    plt.title('Функция F(t)')
    plt.xlabel('t')
    plt.ylabel('F(t)')
    plt.grid()
    plt.show()


def analitic_integral():
    """Вычисление площади по интегралу аналитически"""
    def integral1(t):
        return 16/(t+1)
    def integral2(t):
        return 8*math.sin(2*math.pi*(t-1))+8
    def integral3(t):
        return 8-32*((t-2)**2)
    return quad(integral1, 0, 1)[0] + quad(integral2, 1, 2)[0] + quad(integral3, 2, 3)[0]


def monte_karlo():
    """Вычисление площади по интегралу методом Монте-Карло"""
    x_min=0
    x_max=3
    i_max=14
    F=[]
    # Итерация по i
    for i in range(i_max+1):
        N=2**i
        a=0
        # Итерация по количеству экспериментов
        for _ in range(N-1):
            rand_x=rd.uniform(x_min,x_max)
            if rand_x<1:
                a+=round(16/(rand_x+1),2)
            elif rand_x>=1 and rand_x<=2:
                a+=round(8*math.sin(2*math.pi*(rand_x-1))+8,2)
            elif rand_x>2:
                a+=round(8-32*((rand_x-2)**2),2)
        # Запись результатов интегрирования
        F.append((x_max-x_min)/N*a)
    x=[]
    y=[]
    res_func = analitic_integral()
    for i in range (i_max+1):
        x.append(2**i)
        y.append(res_func)
    # Вывод результатов экспериментального моделирования
    print(pd.DataFrame({'i для 2**i': list(range(0,i_max+1)), 'Оценка интеграла': F}))
    # График, показывающий эффективность метода Монте-Карло по мере увеличения количества экспериментов
    f, ax = plt.subplots(1)
    ax.set_xscale('log', base=2)
    ax.plot(x,F, label='Интеграл по Монте-Карло')
    ax.plot(x,y, label='Интеграл аналитически')
    ax.legend()
    plt.title('Сравнение графиков F(t) и F^(N)')
    plt.show()


plot_ft()
print('Аналитическое значение рез функции: ', analitic_integral())
monte_karlo()
Соседние файлы в предмете Имитационное моделирование