Скачиваний:
4
Добавлен:
05.01.2024
Размер:
2.92 Кб
Скачать
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.integrate import quad

# Функции для создания графика
f1 = lambda x: 10*(4*(x)**2 - 1)
f2 = lambda x: 15*(2/((x-1) + 1))
f3 = lambda x: -15*(2*(x-2) - 1)

# Функция создания исходного графика
def create_graph(x, y, fig):
    fig = plt.figure(fig)
    plt.plot(x, y, color='black')
    plt.xlabel('Ось X')
    plt.ylabel('Ось Y')
    plt.title('График исходной функции')
    plt.grid()

# Функция алгоритма Монте-Карло
def monteCarlo(N):
    random_nums = np.random.uniform(0, 3, int(N))
    y = []
    for num in random_nums:
        if num < 1:
            y.append(f1(num))
        elif 1 <= num < 2:
            y.append(f2(num))
        else:
            y.append(f3(num))
    pred_F = (3 / N) * np.sum(y)
    return pred_F

# Функция графического представления результатов
def create_results(df, fig):
    plt.figure(fig)
    plt.plot(df.x, df.y, label='Монте-Карло', color='b')
    plt.semilogx(base=2)
    plt.plot(df.x, [F]*len(df.y), label='Теоретическое значение', color='r')
    plt.legend()
    plt.xlabel('Количество случайных чисел')
    plt.ylabel('Значение интеграла')
    plt.title('Сравнение результатов моделирования')
    plt.grid()

if __name__ == '__main__':
    # Базовые параметры
    minimum, maximum, step, tau, size = 0, 3, 0.01, 1, 2**14
    
    # Определение X и Y исходной функции
    x = np.arange(minimum, maximum, step)   
    y = f1(np.arange(minimum, tau, step)).tolist()
    y.extend(f2(np.arange(tau, 2*tau, step)))  
    y.extend(f3(np.arange(2*tau, maximum, step)))

    # График исходной функции
    create_graph(x, y, 1)

    # Теоретическое значение величины интеграла
    F = quad(f1, 0, 1)[0] + quad(f2, 1, 2)[0] + quad(f3, 2, 3)[0]
    print(f'Теоретическое значение интеграла: {F}')
 
    # Разработка и проверка программы примерного вычисления интеграла
    pred_F = monteCarlo(N=size)
    print(f'Приблизительное значение интеграла: {pred_F}')
    
    # Табличное представление данных
    min, max = 1, 15
    x = np.logspace(min, max, base=2, num=14)
    y = [monteCarlo(num) for num in x]
    df = pd.DataFrame({'x': x, 'y': y})
    print(f'\n{df}')
    
    # Графическое представление результатов моделирования
    create_results(df, 2)

    plt.show()
Соседние файлы в папке Лаба 1