我的代码在Scilab中的理解问题

问题描述 投票:0回答:1

我正在执行弹丸运动,我需要在位置x和y之间绘制各种角度的曲线,但scilab仅显示一个图。我很困惑。我的下面的代码

function[H,R,T]=projectile(m,r,h,c,rho,theta,v0,x0,y0,t0)

  g=9.8
  A=%pi*r^2
  k=c*rho*A/2;
  i=1
  t(i)=t0
  x(i)=x0
  y(i)=y0

  for j=0:5
    thetha=theta+j*15;
    vx(i)=v0*cos(thetha*%pi/180);
    vy(i)=v0*sin(thetha*%pi/180);
    while (y(i)>=0)
      v=sqrt(vx(i)^2+vy(i)^2);
      t(i+1)=t(i)+h;
      vx(i+1)=vx(i)-h*(k*v*vx(i)/m);
      vy(i+1)=vy(i)-h*(g+k*v*vy(i)/m);  
      x(i+1)=x(i)+h*vx(i)
      y(i+1)=y(i)+h*vy(i)
      i=i+1;  
    end
    plot(x(i),y(i),'.'); 
  end

  n=i-1
  R=x(n)-x(1);
  T=t(n);
  H=max(y)

endfunction

while-loop scilab
1个回答
2
投票

您应该使用向量来提高代码的兼容性和可读性。这是我对改进的(和有效的)代码的建议:

function [H,R,T] = projectile(m,r,h,c,rho,theta0,v0,x0,y0,t0)
    g = 9.81
    A = %pi*r^2
    k = c*rho*A/2;

    for theta = theta0 + (0:15:75)
        v = v0*[cos(theta*%pi/180); sin(theta*%pi/180)];
        t = t0
        xy = [x0;y0]
        i = 1
        while xy(2,i) >= 0
            t(i+1) = t(i)+h;
            v = v + h*([0;-g] - k*norm(v)*v/m);
            xy(:,i+1) = xy(:,i) + h*v;
            i = i+1;
        end
        plot(xy(1,:), xy(2,:));
    end    

    R = xy(1,$) - xy(1,1);
    T = t($);
    H = max(xy(2,:))
endfunction

clf
[H,R,T] = projectile(1,0.1,0.001,2,1000,5,1,0,0,0)

Screenshot of graphical output of program

© www.soinside.com 2019 - 2024. All rights reserved.