首页 > 解决方案 > 绘制两个变量函数

问题描述

我正在尝试绘制一个两个变量函数。我看到了几个例子,并完全按照他们所做的。但我不知道如何解决这个错误?任何帮助将不胜感激。

if Z.ndim != 2:
AttributeError: 'Mul' object has no attribute 'ndim'

我的代码:

import sympy as sp
import math
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm   #(imports color map tools)
r1,r2,r, labda,sigma, sigmalabda, X, Y, x, y, z, l, I, P = sp.symbols("r1,r2,r, labda,sigma, 
sigmalabda, x, X1, X2, y,z, l, I, P")

Kb = 1.38*10**(-23) #Boltzmann's constant
T = 293 #Room temperature(Kelvin)
labda = l
labda = 89
I = 304.4
sigma = 7.63*10**(-18)
#P = 133.322 #partial pressure of Oxygen (pascals) or (100militorr)

#density of Oxygen
n = (P/(Kb * T))
print('n: ', n)
print('pi: ', math.pi)

#Absorption coefficient
K = (1/(n*sigma))
print('K: ', K)


def f(r, P):
    return (304.4)*(sp.exp((r*293*1.38*10**(-23))/(P*7.63*10**(-18))))
r = np.linspace(1, 11, 50) #from 1cm to 100cm
P = np.linspace(133.322, 66661.2, 100) #from 1Torr to 500Torr
#P = np.linspace(1, 500, 100) #from 1Torr to 500Torr
X, Y = np.meshgrid(r, P) #create an array containing all values pairs(ri, Pi)
Z = f(X, Y)
#Phi = np.array(r, P)
#Z = (304.4)*(sp.exp((r*293*1.38*10**(-23))/(P*7.63*10**(-18))))
fig = plt.figure()
ax = plt.axes(projection = "3d")
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = "jet", edgecolor = "none")
plt.xlabel('r')
plt.ylabel('P')
ax.set_title("surface")
plt.show()

标签: pythonnumpymatplotlib

解决方案


该函数f(r, P)使用 sympy 函数sp.exp。Sympy 用于符号计算,它在这里不能正常工作:它会导致f返回一个 sympyMul对象而不是一个 numpy 数组。将其替换为sp.expnp.exp它应该可以工作:

def f(r, P):
    return (304.4)*(np.exp((r*293*1.38*10**(-23))/(P*7.63*10**(-18))))

推荐阅读