Я столкнулся с проблемой при попытке построить область пересечения для определенных неравенств в 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