我是python的新手。问题在于,假设我们有两个参数x和y,以及四个函数f_1,f_2,f_3和f_4。假设我们知道:
我需要绘制一个x轴= x和y轴= y的图,该图显示了每个函数为最大函数的区域。
我使用了以下代码,但是如下所示的结果图并不准确。
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(0,10,.1)
y = np.arange(0,15,.2)
x,y = np.meshgrid(x,y)
maxf = np.zeros(shape = x)
maxf.fill(-9999.99)
for i in range(len(x)):
for j in range(len(y)):
if j<i<5 or j<5<i:
maxf[i,j] =1
elif i<5<=j<i+5 or 5<=j<i:
maxf[i,j] =2
elif 5<i<=j<i+5 or i<=j<5:
maxf[i,j] =3
elif i == 5 and j<5:
maxf[i,j]=1
elif i == 5 and 5<=j<10:
maxf[i,j]=2
elif j >= 5+i:
maxf[i,j]=4
plt.contourf(x,y,maxf)
plt.colorbar()
plt.show()
结果应该如下图所示:
答案 0 :(得分:1)
当您将初始数组设置为-9999.99时,现在必须确保仅绘制所需的介于1-3之间的值。由于该值的大小要大得多,因此不会包含在您的绘图中。使用以下方法为绘图设置轮廓级别:
plt.contourf(x,y,maxf,[0,1,2,3])
收益:
更新
我之前没有注意到,但是您正在使用i,j
就像它们是数字一样,但是它们实际上代表了数组的索引,这使您的计算陷入困境。您需要知道索引和值,以便可以使用enumerate
。如果这仍然不正确,那么您需要根据情况重新考虑逻辑。
import numpy as np
from matplotlib import pyplot as plt
y = np.arange(0,15,.01)
x = np.arange(0,10,.01)
Y,X = np.meshgrid(y,x)
maxf = np.zeros(shape = Y.shape)
maxf.fill(-9999.99)
for i,x_ in enumerate(x):
for j, y_ in enumerate(y):
if y_<x_<5 or y_<5<x_:
maxf[i,j] =3
elif x_<5<=y_<(x_+5) or 5<=y_<x_:
maxf[i,j] =1
elif 5<x_<=y_<(x_+5) or x_<=y_<5:
maxf[i,j] =2
elif x_ == 5 and y_<5:
maxf[i,j]=3
elif x_ == 5 and y_>=5:
maxf[i,j]=1
elif y_ >= (5+x_):
maxf[i,j]=4
plt.contourf(X,Y,maxf,[0,1,2,3,4])
plt.colorbar()
plt.show()
最终通知
仅仅因为您添加了一个条件并不意味着它会在首先满足另一个条件时得到评估。在这种情况下,您的第四个函数永远不会成立,因为始终满足其他条件之一。如果首先需要该条件,则将其作为您的第一个if
语句。安排逻辑语句的方式尤其重要,因为您有很多条件,并且其中一些条件相互重叠。