我是python的新手并试图用3d绘制分段函数。我正试图用3d绘制“主要公式”。 z轴上的函数随着x和y的变化而变化,范围从0到10,常数= 1.但我似乎无法在这里找出绘图方法。
from sympy import *
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
def mainformula(x,y,constant):
return Piecewise((subformula1(x,y,constant), y >= 0 and y < 3),(subformula2(x,y,constant),y>=3 and y <= 10))
def subformula1(x,y,constant):
return x + y + constant
def subformula2(x,y,constant):
return x - y - constant
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 10, 0.25)
Y = np.arange(0, 10, 0.25)
constant = 1
X, Y = np.meshgrid(X, Y)
Z = mainformula(X,Y,constant)
surf = ax.plot_surface(X, Y, Z)
plt.show()
运行该代码时得到的错误是:&#34; ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()&#34;
答案 0 :(得分:1)
您正在处理数组,因此它永远无法在布尔上下文中使用array > 3
(例如使用and
)这将始终为您提供所收到的错误。但是,您始终可以将条件定义为布尔掩码,并在适当的元素上运行公式:
def mainformula(x,y,constant):
z = np.zeros_like(x)
# Condition 1 indexes all elements where subformula 1 is valid
condition1 = np.logical_and(y >= 0, y < 3)
# condition1 = (y >= 0) & (y < 3) # is another way of writing it
z[condition1] = x[condition1] + y[condition1] + constant
# now do it in the range where subformula 2 is valid
condition2 = np.logical_and(y >= 3, y <= 10)
# condition1 = (y >= 3) & (y <= 10) # is another way of writing it
z[condition2] = x[condition2] - y[condition2] - constant
return z
这不会使用sympy.Piecewise
,但只在尝试绘图时才能正常工作。如果您需要单独的函数而不是在主公式中完成所有操作,则需要稍微更改一下:
z[condition1] = subformula1(x[condition1], y[condition1], constant)
和condition2
类似。
答案 1 :(得分:0)
问题是你试图将逻辑断言变成没有直接断言的数组。 Python很难断言这是什么:
y >= 0 and y < 3
因此,您必须将代码更改为可以理解的内容:
def mainformula(x,y,constant):
y2 = y[y>=0]
y2 = y2[y2<3]
y3 = y[y>=3]
y3 = y2[y2<=10]
return Piecewise((subformula1(x,y,constant), y2),(subformula2(x,y,constant),y3))
问题是Piecewise函数似乎也没有接受一些数组到你拥有的参数之一。您可能需要重新考虑您的问题,可能是通过为Piecewise函数构建一个循环,以便在每个元素上启动。