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

ЛР / ЛР1 / SM_LR1

.py
Скачиваний:
6
Добавлен:
25.06.2023
Размер:
3.76 Кб
Скачать
from matplotlib import pyplot as plt
from scipy import integrate
import numpy as np


def ploting_rez_fun(f1, f2, f3):
    '''Построение графика результирующей функции'''
    # Генерация последовательности для x1, x2, x3
    t1 = np.arange(0,1,0.001)
    t2 = np.arange(1,2,0.001)
    t3 = np.arange(2,3,0.001)

    plt.plot(t1, f1(t1), label='f1(t1) = 7*(np.sin(2*np.pi*t)+1)')
    plt.plot(t2, f2(t2), label='f2(t2) = -7*(4*(t-1)**2-1)')
    plt.plot(t3, f3(t3), label='f3(t3) = -21*(np.sin(2*np.pi*(t-2))+1)')
    plt.title("График результирующей функции")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.legend()
    plt.show()



def integrete_fun(f1, f2, f3):
    '''Вычисление интеграла от результирующей функции'''
    fr = integrate.quad(f1, 0, 1)[0]  \
       + integrate.quad(f2, 1, 2)[0]  \
       + integrate.quad(f3, 2, 3)[0]  
    print('Значение интеграла от результирующей функции:', fr)
    return fr


def monte_carlo_integrate(f1, f2, f3):
    '''Вычисление величины F методом Монте-Карло'''
    # Оценка интеграла при N=2^i экспериментах, где i = (0,14)
    rating = []
    for i in range(0,15):
        frez = []
        for j in range(2**i):
            # Задание x рандомнного значения от 0 до 3
            x = np.random.uniform(0,3)
            if x < 1:
                # Передаем x лямбда функции f1
                frez.append(f1(x))
            elif 1 <= x <= 2:
                # Передаем x лямбда функции f2
                frez.append(f2(x))
            else:
                # Передаем x лямбда функции f3
                frez.append(f3(x))
        # Формула оценки определенного интеграла
        rating.append(3 *sum(frez)/2**i)

    for i in range(len(rating)):
        print('2^', i, 'экспериментов\t-', rating[i])
    
    return rating


def ploting_score_graph(rating, fr):
    '''Построение графика зависимости оценки интеграла от количества экспериментов'''
    plt.plot(range(len(rating)), rating, label='Оценка интегралла')
    plt.plot(range(len(rating)), [fr]*len(rating)
            ,color='green', label='Значение результирующей функции')
    plt.title("График зависимости оценки интеграла от количества экспериментов")
    plt.xlabel("i")
    plt.ylabel("f(x)")
    plt.legend()
    plt.show()



def main():
    # Создание лямбда функции для f1(x), f2(x) и f3(x):
    f1 = lambda t:   7 *( np.sin( 2*np.pi*t )+ 1 )
    f2 = lambda t:  -7 *( 4*(t-1)**2 - 1 )
    f3 = lambda t: -21 *( np.sin( 2*np.pi*(t-2) )+ 1 )

    # Построение графика результирующей функции
    ploting_rez_fun(f1, f2, f3)

    # Вычисление интеграла от результирующей функции
    fr = integrete_fun(f1, f2, f3)

    # Оценка интеграла при N=2^i экспериментах, где i = (0,14)
    rating = monte_carlo_integrate(f1, f2, f3)

    # Построение графика зависимости оценки интеграла от количества экспериментов
    ploting_score_graph(rating, fr)



if __name__ == "__main__":
	main()
Соседние файлы в папке ЛР1