python - 绘制两个变量函数
问题描述
我正在尝试绘制一个两个变量函数。我看到了几个例子,并完全按照他们所做的。但我不知道如何解决这个错误?任何帮助将不胜感激。
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()
解决方案
该函数f(r, P)
使用 sympy 函数sp.exp
。Sympy 用于符号计算,它在这里不能正常工作:它会导致f
返回一个 sympyMul
对象而不是一个 numpy 数组。将其替换为sp.exp
,np.exp
它应该可以工作:
def f(r, P):
return (304.4)*(np.exp((r*293*1.38*10**(-23))/(P*7.63*10**(-18))))
推荐阅读
- windows - 无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。docker 守护进程是否正在运行?(Ubuntu 20.04,WSL2)
- autodesk-forge - 如何像 Civil3D 一样从 API 获取 AutoCAD Civil3D 绘图范围?
- node.js - 如何从后端实现搜索并在fontend中使用它?
- firebase - 带有弹出窗口的 Firebase 身份验证 - 仅允许注册用户
- python - 扩展项目然后删除python中嵌套列表中的项目
- java - 数组 - 通过引用调用
- r - 在 R 中创建 BIG 时空时间序列数据
- c# - 根据 ASP.net 中的值使字段只读:C#、ASP.Net
- c# - 使用 addtorque 将对象旋转到特定点
- html - 如何将一个div分成两行