2015-10-27 2 views
1

У меня возникла проблема с моим кодом. Код должен найти линейный потенциал (V) в поле. Он дает ошибку, которую я раньше не видел. Хотя код, где ошибка кажется логичным. Может кто-нибудь объяснить, почему это происходит, когда «если delta0> дельта»ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all (

Спасибо заранее,

Вот мой код

  # -*- coding: utf-8 -*- 
""" 
Created on Thu Oct 22 11:32:00 2015 

@author: 50073507 
""" 

import numpy as np 

import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

from mpl_toolkits.mplot3d import axes3d 

np.set_printoptions(formatter={'float': '{: 0.2f}' . format}) 

def relax(v): 
    return (v[i-1,j] + v[i+1, j], + v[i,j-1] + v[i,j+1]) 

tolerance = 1.e-6 
delta = 1.0 
nx =7 
ny = 7 

v = np.zeros([nx,ny]) 
v[:,0] = -1 
v[:,-1] = 1 
v[0,:] = np.linspace(-1,1,nx) 
v[ny-1,:] = np.linspace(-1,1,nx) 

print("starting values") 
print(v) 

iteration = 0 

while delta > tolerance: 
    delta = 0 
    for i in range(1,nx-1): 
     for j in range(1,ny-1): 
      newVij = relax(v) 
      delta0 = np.abs(newVij - v[i,j]) 
      if delta0 > delta: 
       delta = delta0 
      v[i,j] = newVij 
     iteration += 1 
     print ("Iteration", iteration) 
     print(v) 


x = np.linspace(-1,1,nx) 
y= np.linspace(-1,1,ny) 
x, y = np.meshgrid(x,y) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection = '3d') 
surf = ax.plot_surface(x, y, v , alpha = 0.7, cmap = cm.coolwarm) 
cset = ax.contourf(x,y,v,zdir='v',offset=-1,cmap=cm.coolwarm) 
plt.show() 


Ey, Ex = np.gradient(-v) 

fig , ax = plt.subplots() 
ax.quiver(x,y, Ex, Ey, y) 
ax.set(aspects = 1, title = 'Eletric Field') 
plt.axis([-1.05, 1.05,-1.05,1.05]) 
plt.show()   
+0

Сообщите об ошибке (traceback) –

+3

Возможный дубликат [ValueError: значение истины массива с несколькими элементами неоднозначно. Используйте a.any() или a.all()] (http://stackoverflow.com/questions/10062954/valueerror-the-truth-value-of-an-array-with-more-thon-one-element- is-неоднозначный) –

ответ

0

Вы» Попробуйте сравнить кортеж с поплавком. Проверьте свою функцию:

def relax(v): 
    return (v[i-1,j] + v[i+1, j], + v[i,j-1] + v[i,j+1]) 

Это вернет кортеж (v[i-1,j] + v[i+1, j], + v[i,j-1] + v[i,j+1]).

И в вашем while вы получили это:

newVij = relax(v) 
delta0 = np.abs(newVij - v[i,j]) 
if delta0 > delta: 

Ну, delta0 его кортеж и дельта-поплавок, это проблема.

+0

большое спасибо. Я ценю время, которое вы взяли, чтобы посмотреть на мою программу. –

Смежные вопросы

 Смежные вопросы