Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2023, 13:10   #1
himecu
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 32
По умолчанию Проблема с построением области пересечения для произвольных неравенств в Python

Я столкнулся с проблемой при попытке построить область пересечения для определенных неравенств в Python с использованием библиотек matplotlib, sympy и scipy. В частности, я хочу, чтобы код точно отображал область для любых неравенств, а не только для "y - x > 0" и "y - x ** 2 < 0". Однако в текущем коде область пересечения строится некорректно для других неравенств. Полученный график неправильно отображает область пересечения ограничений. Буду благодарен за советы или помощь опытных программистов по изменению кода для правильного построения области пересечения для этих конкретных неравенств. Вот текущий код, который я использую:
Код:
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
from scipy.spatial import Delaunay

def plot_inequalities(inequality1, inequality2):
    x, y = symbols('x y')

    try:
        inequality1_expr = sympify(inequality1)
        inequality2_expr = sympify(inequality2)
    except:
        print("Ошибка: некорректный формат неравенства.")
        return

    try:
        F1 = lambdify((x, y), inequality1_expr, 'numpy')
        F2 = lambdify((x, y), inequality2_expr, 'numpy')
    except:
        print("Ошибка: не удалось скомпилировать неравенства.")
        return

    # Создание сетки значений x и y (до применения алгоритма измельчения)
    x_vals_coarse = np.linspace(-10, 10, 200)
    y_vals_coarse = np.linspace(-10, 10, 200)
    X_coarse, Y_coarse = np.meshgrid(x_vals_coarse, y_vals_coarse)

    # Проверка неравенств в каждой точке сетки (до применения алгоритма измельчения)
    inequality1_result_coarse = F1(X_coarse, Y_coarse)
    inequality2_result_coarse = F2(X_coarse, Y_coarse)

    # Нахождение точек пересечения неравенств (до применения алгоритма измельчения)
    intersection_points_coarse = []
    for i in range(len(x_vals_coarse)):
        for j in range(len(y_vals_coarse)):
            if inequality1_result_coarse[j, i] < 0 and inequality2_result_coarse[j, i] > 0:
                intersection_points_coarse.append([x_vals_coarse[i], y_vals_coarse[j]])

    intersection_points_coarse = np.array(intersection_points_coarse)

    # Триангуляция Делоне по точкам пересечения (до применения алгоритма измельчения)
    if len(intersection_points_coarse) >= 3:
        tri_coarse = Delaunay(intersection_points_coarse[:, :2])

    # Создание сетки значений x и y (после применения алгоритма измельчения)
    x_vals_fine = np.linspace(-10, 10, 300)
    y_vals_fine = np.linspace(-10, 10, 300)
    X_fine, Y_fine = np.meshgrid(x_vals_fine, y_vals_fine)

    # Проверка неравенств в каждой точке сетки (после применения алгоритма измельчения)
    inequality1_result_fine = F1(X_fine, Y_fine)
    inequality2_result_fine = F2(X_fine, Y_fine)

    # Нахождение точек пересечения неравенств (после применения алгоритма измельчения)
    intersection_points_fine = []
    for i in range(len(x_vals_fine)):
        for j in range(len(y_vals_fine)):
            if inequality1_result_fine[j, i] < 0 and inequality2_result_fine[j, i] > 0:
                intersection_points_fine.append([x_vals_fine[i], y_vals_fine[j]])

    intersection_points_fine = np.array(intersection_points_fine)

    # Триангуляция Делоне по точкам пересечения (после применения алгоритма измельчения)
    if len(intersection_points_fine) >= 3:
        tri_fine = Delaunay(intersection_points_fine[:, :2])

    # Построение графиков
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))

    # График до применения алгоритма измельчения
    if len(intersection_points_coarse) >= 3:
        ax1.triplot(intersection_points_coarse[:, 0], intersection_points_coarse[:, 1], tri_coarse.simplices.copy(), color='black')
    ax1.set_title('До применения алгоритма измельчения')
    ax1.axis('off')

    # График после применения алгоритма измельчения
    if len(intersection_points_fine) >= 3:
        ax2.triplot(intersection_points_fine[:, 0], intersection_points_fine[:, 1], tri_fine.simplices.copy(), color='black')
    ax2.set_title('После применения алгоритма измельчения')
    ax2.axis('off')

    # Отображение графиков
    plt.show()

# Запуск программы
print("Введите неравенство снизу в формате 'F(x, y) > 0':")
inequality1 = "y-x"
print("Введите неравенство сверху в формате 'F(x, y) < 0':")
inequality2 = "y-x**2"
plot_inequalities(inequality1, inequality2)
Буду благодарен за любые идеи или рекомендации, которые могут помочь решить эту проблему. Спасибо! Изображение самого графика:
Снимок.PNG

Последний раз редактировалось himecu; 08.06.2023 в 13:15.
himecu вне форума Ответить с цитированием
Старый 08.06.2023, 15:42   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

вы знаки так и не исправили?..
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив С++ проблема с построением ivanchel Помощь студентам 5 04.06.2011 13:34
проблема с построением диаграммы в Charte Kurai Помощь студентам 0 17.05.2010 20:37
Проблема с построением графика Pirat_of Microsoft Office Excel 2 19.05.2009 20:35
Проблема с построением графика xaero93 Помощь студентам 2 28.02.2009 21:30