Python ValueError图

时间:2015-04-07 21:41:39

标签: python

这是我第一次使用python(和stackoverflow),并且它一直显示" ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()"

有谁能告诉我我做错了什么? 它应该显示三个图表。

K,r,a,h,e,m=9,0.5,0.3,0.05,0.1,0.1
def dz(N,P):
    return (r*N*(1-N/K)-a*N*P/(1+a*h*N),e*a*N*P/(1+a*h*N)-m*P)
N0,P0=6,4
pas=10**(-3)
def z(t):
    u,x,y=0,N0,P0
    if t>0 :
        while t-u>pas:
            x,y,u=x+pas*dz(x,y)[0],y+pas*dz(x,y)[1],u+pas
        return x+(t-u)*dz(x,y)[0],y+(t-u)*dz(x,y)[1]
    else :
        while u-t>pas:
            x,y,u=x-pas*dz(x,y)[0],y-pas*dz(x,y)[1],u-pas
        return x+(t-u)*dz(x,y)[0],y+(t-u)*dz(x,y)[1]
def N(t):
    return z(t)[0]
def P(t):
    return z(t)[1]
close()
figure('N(t), P(t), P(N)')
t=linspace(0,15,100)
autoscale(enable=True, axis=u'both', tight=None)
plot(t,N(t),'b--',t,P(t),'r--',N(t),P(t),'k')
axis('scaled')
grid(True)

问题解决了,请看答案。

2 个答案:

答案 0 :(得分:0)

您需要先编写一些练习代码。例如,在开始编写一些很棒的代码之前,要了解如何编写和使用函数以及传递给函数的内容。人们会说罗马不是一天建成的。

回到你的代码:你希望函数Z(t)处理t的方式是一个单一的变量。但是,当您使用N(t)并调用Z(t)时,t将作为数组传递给Z(t)。

解决方案:在指定t后添加for循环,计算数组t中每个t_i的每个N(t_i),然后相应地更改绘图部分;或者,您必须更改" if else"部分在z(t)的定义中,将t视为一个数组(例如循环到t)。

答案 1 :(得分:0)

首先感谢您的解决方案/评论。

我不再有错误消息了。我的图表显示了他们应该做的事情。

您是否有任何提示使代码更快?因为显示图表仍然需要花费大量时间(而且我的老/慢PC并不喜欢这样)。

这是新代码(是的,我知道,这样一个简单的代码真的很长,但它确实有效):

from pylab import *

K,r,a,h,e,m=20,0.5,0.3,0.05,0.1,0.1
def dz(N,P):
    return (r*N*(1-N/K)-a*N*P/(1+a*h*N),e*a*N*P/(1+a*h*N)-m*P)
N0=10
P0=3
print('conditions initiales :')
print('N0=')
print(N0)
print(' P0=')
print(P0)
pas=10**(-3)
def z(t):
    u,x,y=0,N0,P0
    if t>0 :
        while t-u>pas:
            x,y,u=x+pas*dz(x,y)[0],y+pas*dz(x,y)[1],u+pas
        return x+(t-u)*dz(x,y)[0],y+(t-u)*dz(x,y)[1]
    else :
        while u-t>pas:
            x,y,u=x-pas*dz(x,y)[0],y-pas*dz(x,y)[1],u-pas
        return x+(t-u)*dz(x,y)[0],y+(t-u)*dz(x,y)[1]
def N(t):
    return z(t)[0]
def P(t):
    return z(t)[1]
close()
figure('N(t), P(t), P(N)')
n=100
t=linspace(0,100,n)
N1=zeros(n)
P1=zeros(n)
for i in range(len(t)):
    N1[i]=N(t[i])
    P1[i]=P(t[i])
subplot(2,2,1)
plot(t,N1,'b--')
title('N(t)')
xlabel('t')
ylabel('N')
autoscale(enable=True, axis=u'both', tight=True)
grid(True)
subplot(2,2,2)
plot(t,P1,'r--')
title('P(t)')
xlabel('t')
ylabel('P')
autoscale(enable=True, axis=u'both', tight=True)
grid(True)
subplot(2,2,3)
plot(N1,P1,'k')
xlabel('N')
ylabel('P')
autoscale(enable=True, axis=u'both', tight=True)
grid(True)

感谢您的帮助,祝您度过愉快的一天。