在使用NumPy、Matplotlib、SymPy和SciPy库的代码中,有一个名为plot_inequalities的函数,用于使用Delaunay三角剖分绘制两个不等式的相交区域。然而,当运行代码时,Delaunay三角剖分没有正确构建。下面是代码:
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
from scipy.spatial import Delaunay
def plot_inequalities(inequality1, inequality2, x_min, x_max, y_min, y_max):
x, y = symbols('x y')
try:
inequality1_expr = sympify(inequality1)
inequality2_expr = sympify(inequality2)
except:
print("Error: Incorrect inequality format.")
return
try:
F1 = lambdify((x, y), inequality1_expr, 'numpy')
F2 = lambdify((x, y), inequality2_expr, 'numpy')
except:
print("Error: Failed to compile inequalities.")
return
# Create grid of x and y values
x_vals = np.concatenate(([0], np.linspace(x_min, x_max, 400)))
y_vals = np.linspace(y_min, y_max, 400)
X, Y = np.meshgrid(x_vals, y_vals)
# Check inequalities at each grid point
inequality1_result = F1(X, Y)
inequality2_result = F2(X, Y)
# Find intersection points of the inequalities
intersection_points = []
for i in range(len(x_vals)):
for j in range(len(y_vals)):
if inequality1_result[j, i] < 0 and inequality2_result[j, i] > 0:
intersection_points.append([x_vals[i], y_vals[j]])
intersection_points = np.array(intersection_points)
# Delaunay triangulation of intersection points
if len(intersection_points) >= 3:
tri = Delaunay(intersection_points[:, :2])
# Plot the graph
plt.triplot(intersection_points[:, 0], intersection_points[:, 1], tri.simplices.copy(), color='black')
# Display the graph
plt.xlabel('x')
plt.ylabel('y')
plt.grid(False)
plt.axis('equal')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.show()
print("Enter the lower inequality in the format 'F(x, y) > 0':")
inequality1 = input()
print("Enter the upper inequality in the format 'F(x, y) < 0':")
inequality2 = input()
print("Enter the x interval boundaries in the format 'x_min, x_max':")
x_min, x_max = map(float, input().split(','))
print("Enter the y interval boundaries in the format 'y_min, y_max':")
y_min, y_max = map(float, input().split(','))
plot_inequalities(inequality1, inequality2, x_min, x_max, y_min, y_max)
示例区域:y-x>0且y-x**2<0
1条答案
按热度按时间pcww981p1#
plot_inequalities
函数的问题是没有正确过滤intersection_points
数组以删除重复点。当intersection_points
数组包含重复点时,无法正确构建Delaunay三角剖分。要解决此问题,可以在构建Delaunay三角剖分之前添加一个检查,以从intersection_points
阵列中删除重复点。下面是更新的代码:
通过这种修改,
intersection_points
数组首先被转换为numpy数组,然后使用unique
函数进行过滤以删除任何重复点。然后使用得到的intersection_points
数组来构造Delaunay三角剖分,并绘制两个不等式的相交区域。**P.S.**我在代码中硬编码了不等式。您可以通过更改
np.linspace(x_min, x_max, 150)
和np.linspace(y_min, y_max, 400)
中的点数来更改x_vals
和y_vals
的数量,以查看三角剖分。