python - 如何从电势中找到电场?
问题描述
这是我在电离室中找到电位器的脚本:
# Programme de résolution de l'équation de Laplace
# par la méthode de Gauss-seidel
# importation des librairies
import numpy as np
import time
import matplotlib.pyplot as plt
# définition des paramétres physiques de l'expérience
Vi = 300.0 # le couvercle est à 300 V
V0 = 0.0 # les cotés sont au potentiel nul
x = 0
# définition de la grille de calcul
M = 50
N = 300 # nombre de pas sur la grile (identique en Ox et Oy)
V = np.zeros([M,N]) # grille de calcul courante
Vnew = np.zeros([M,N]) # grille de stockage des calculs nouveaux
# critère de précision du calcul
EPS = 1e-3
# initialisation des compteurs
ecart = 1.0
iteration = 0
# définition des conditions aux limites
V[0:8, 0:20] = x
V[8:15, 0:10] = x
V[35:50, 0:10] = x
V[42:50, 0:20] = x
V[0,20:300] = Vi # bord supérieur
V[0:8, 20] = Vi # vue que 1.6/0,2 = 8
V[41:50, 20] = Vi # bas de la bord gauche
V[8, 10:21] = Vi
V[15, 0:11] = Vi
V[34, 0:11] = Vi
V[41, 10:21] = Vi
V[8:15, 10] = Vi
V[34:41, 10] = Vi
V[15:35, 0] = Vi
V[:,-1] = Vi # bord droit
V[-1,20:300] = Vi # bord inférieur
V[23:27,15:299] = V0
# début du calcul - enregistrement de la durée
tdebut = time.time()
# boucle de calcul - méthode de Gauss-Seidel
while ecart > EPS:
iteration += 1
# sauvegarde de la grille courante pour calculer l'écart
Vavant = V.copy()
# calcul de la nouvelle valeur du potentiel sur la grille
V[1:-1,1:-1]= 0.25*(Vavant[0:-2,1:-1] +V[2:,1:-1] + Vavant[1:-1,0:-2] + V[1:-1,2:])
# on repose les même conditions
V[0:8, 0:20] = x
V[8:15, 0:10] = x
V[35:50, 0:10] = x
V[42:50, 0:20] = x
V[0,20:300] = Vi
V[0:8, 20] = Vi
V[41:50, 20] = Vi
V[8, 10:21] = Vi
V[15, 0:11] = Vi
V[34, 0:11] = Vi
V[41, 10:21] = Vi
V[8:15, 10] = Vi
V[34:41, 10] = Vi
V[15:35, 0] = Vi
V[:,-1] = Vi
V[-1,20:300] = Vi
V[23:27,15:299] = V0
# critère de convergence
ecart = np.max(np.abs(V-Vavant))
# fin du calcul - affichage de la durée
print ('Nombre iterations : ',iteration )
print ('Temps de calcul (s) : ',time.time() - tdebut)
v, u = np.gradient(V)
x = np.linspace(0, 1, N) # x-axis
y = np.linspace(0, 1, M) # y-axis
X, Y= np.meshgrid(x,y)
# Create figure
fig, axarr = plt.subplots(1, 1, figsize=(14, 8), dpi=300)
# Axes 1: Electric potential and field
im1 = axarr[0].contourf(x, y, V, 20)
axarr[0].streamplot(x, y, -u, -v, color="k")
axarr[0].set_title("Electric potential and field")
fig.colorbar(im1, orientation='horizontal', ax=axarr[0],
label=r"Electric potential, $V/V_0$")
axarr[0].set_xlabel("$x/L$")
axarr[0].set_ylabel("$y/L$")
但我在 affichage 方法中有一个问题,错误在第 90 行:
line 90, in <module>
im1 = axarr[0].contour(x, y, V, 20)
TypeError: 'AxesSubplot' object is not subscriptable
我几乎尝试了所有方法,但找不到解决方案。我该如何解决这个错误?
解决方案
matplotlib.pyplot.subplots
返回实例数组matplotlib.axes.Axes
或单个matplotlib.axes.Axes
实例。后者仅当行数(第一个位置参数)和列数(第二个位置参数)都是1
. 所以语法
fig, ax = plt.subplots(1, 1)
创建单个Axes
实例(也称为AxesSubplot
),因此ax[0]
是非法的 - 只有当多个子图由plt.subplots
. 代码中的正确语法是
fig, axarr = plt.subplots(1, 1, figsize=(14, 8), dpi=300)
im1 = axarr.contourf(x, y, V, 20)
axarr.streamplot(x, y, -u, -v, color="k")
axarr.set_title("Electric potential and field")
fig.colorbar(im1, orientation='horizontal', ax=axarr,
label=r"Electric potential, $V/V_0$")
axarr.set_xlabel("$x/L$")
axarr.set_ylabel("$y/L$")
推荐阅读
- c++ - 如何一键从 QGraphicsScene 创建 png 图像
- ios - 如何快速列出我的 iPhone 设备中的所有 pdf 文件
- javascript - 我想使用 java 脚本获取客户端 IP 客户端连接到 LAN 或 WIFI
- javascript - Javascript 删除线
- java - 如何使用枚举序数 queryDSL 创建查询
- python - socket.send 和 socket.sendall() 的区别
- twitter-bootstrap - Vue少加载css“无法读取未定义的属性'分母'”
- c# - 如何使用 C# 将 CSV 文件转换为 Parquet
- html - 使用 Nginx 在 Linux 中的静态文件
- mysql - 在 Centos7 上启动时出现 MySQL 5.7 错误