这是我第一次使用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)
问题解决了,请看答案。
答案 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)
感谢您的帮助,祝您度过愉快的一天。