for循环中的索引错误无效

时间:2015-08-07 15:14:10

标签: scilab

我已经在这段代码中工作了一段时间,它非常简单,只是递归计算。在while循环中,在第一行中我得到了一个索引错误。有趣的是,在我开始在循环中使用if语句之前,我的索引很好,我可以编译它。我相信我的问题是缺乏对编程方式的熟悉。

///CONSTANTES////

roh_H20 = 1030.00 // [kg/m^3] Água Salgada
roh_ar = 1.22 // [kg/m^3]
g = 9.81 // [m/s^2]

V_elo = 0.00041 // [m^3] 
V_boia = 0.00811 // [m^3] 
V_lastro = 0.00811 // [m^3]

D_corda = 0.030 // [m]
A_corda = 1/4*%pi*D_corda**2
L_corda = 30 // [m]
roh_corda = 905 // [kg/m^3]  poliester
V_corda = A_corda*L_corda // [m^3]

roh_elo = 952 // [kg/m^3] PE Alta Densidade


m_elo = 0.38817 // [kg] 
m_boia = 1.5654 // [Kg] 
m_lastro = 2.5 // [kg] CHUTE
m_corda = roh_corda*V_corda; // [kg]

Cd = 1.3 // coeficiente de arrasto placa plana FOX pg 396

N_elo = 7*24 // conjuntos a cada 1 metro
N_corda = 4 // A definir
N_boia = 7  // 2 primeiros conjuntos   
N_lastro = 7 // 2 últimos conjuntos

/// PROBLEMA ESTATICO ////

M = N_elo*m_elo + N_boia*(m_boia + m_lastro) // FALTA CORDA
P = M*g
Emp = g*(N_boia*V_boia + N_elo*V_elo + N_lastro*V_lastro)*roh_H20;

printf("\n*****PROBLEMA ESTATICO*****\n")
printf("\nO Peso do conjunto eh: %f N\n", P)
printf("\nO Empuxo eh: %f N\n", Emp)


/// PROBLEMA DINÂMICO ///

A_vela = 0.03230 // [m^2] dado pelo SolidWorks
N_vela = 7

printf("\n*****PROBLEMA DINAMICO*****\n")

a = zeros(0,1e3)
a(1)= (Emp-P)/ M
printf("\na_0 = %f [m/s^2]\n", a(1))

t=0
v= zeros(0,1e3)
dy = zeros(0,1e3)
Fd = zeros(0,1e3)


for i=1:50
//    if i == 1 then
//      a(i)= (Emp-P)/ M  
//    else 
//      1+1
//     end      
    v(i+1) = v(i) + a(i)*t
    dy(i+1) =  dy(i)+v(i+1)*t+ a(i)*t*t/2.0
    Fd(i+1) = 0.5*roh_H20*Cd*N_vela*A_vela*v(i+1)**2
    if v(i+1) > 0 then       
        a(i+1) = (Emp - P - Fd(i+1))/ M;
    elseif v(i+1) <= 0 then       
        a(i+1) = (Emp - P + Fd(i+1))/ M;
    end,        
t=t+0.05
end


x = linspace(0,t,int(i))

// Grafico velocidade/aceleração

clf(0)
scf(0)
subplot(2,1,1)
plot(x,a,'ro-')
xlabel("Tempo [s]")
ylabel("Acelaração [m/s^2]")
legend("aceleração")

subplot(2,1,2)
plot(x,v,'bs:')
xlabel("Tempo [s]")
ylabel("velocidade [m/s]")
legend("velocidade")

// Grafico forca/deslocamento

clf(1)
scf(1)
subplot(2,1,1)
plot(x,Fd,'r--d')
xlabel("Tempo [s]")
ylabel("Força [N]")
legend("Força Arrasto")

subplot(2,1,2)
plot(x,dy,'m--^')
xlabel("Tempo [s]")
ylabel("Descolcamento [m]")
legend("deslocamento")

1 个答案:

答案 0 :(得分:0)

每当有索引错误时,控制台中有两件事要做:

  1. 检查索引变量的值(只需输入其名称)
  2. 检查所涉及的任何阵列的大小(使用命令size
  3. 在这种情况下,检查a的大小会显示它不符合您的预期。为什么?因此:

    a = zeros(0,1e3)
    v= zeros(0,1e3)
    dy = zeros(0,1e3)
    Fd = zeros(0,1e3)
    

    zeros的参数是矩阵的高度和宽度。您要求高度0 ...这意味着矩阵,因为它没有行。你想要的是一个行向量,它是一个一个行的矩阵。

    修好后,你会遇到

    的问题
    x = linspace(0,t,int(i))
    plot(x,a,'ro-')
    

    因为x和a的大小不同。

    为了保持尺寸一致,你可以这样做:

    imax = 50;
    a = zeros(1,imax)
    v= zeros(1,imax)
    dy = zeros(1,imax)
    Fd = zeros(1,imax)
    

    以及之后for i=1:imaxx = linspace(0,t,imax)

    这样您就不会创建超大数组,只能创建所需大小的数组,可以通过更改imax的值来调整。