【问题标题】:IF and FOR cycle do not print correct values [closed]IF 和 FOR 循环不打印正确的值
【发布时间】:2020-02-02 12:16:59
【问题描述】:

我有一个可能很愚蠢的问题,但我无法克服它。

这一切的目的是让两个变量F_hor_alb和F_ver_alb根据if语句中报告的规则来定义。

如果该角度的余弦 (60wt) 在这种情况下大于等于 -0.37(阴影)的量,则这两个变量必须具有正弦趋势。否则它们的价值为零。

通过验证余弦和变量的输出,第一个是应该的,但变量的所有值都等于零,除了第一个,因此不遵循余弦本身假设的值。 IF 中有什么不工作的地方吗?

(Fhor 和 Fver 已经在另一段代码中定义)。

Example of output
Cos(60wt): 0,9980         0,9970 0,9960   .....
F_hor_alb: 0,9980*F_hor     0      0        0     0 0 0 0 0 0 0
F_ver_alb: 0,9980*F_ver     0      0        0     0 0 0 0 0


Re = 6378; % Radius of Earth (km)
z = 500; % Orbital Altitude (km)
mu = 3.986004415e5 % Gravitational constan of Earth (km3/s2)
OrbitalT = 2*pi*sqrt(((Re+z)^3)/mu); % Orbital Period (s)
orbits = 30; % Number of cycles for the simulation
simtime = (OrbitalT*orbits)/60; % Simulation time (min)
simstep = 1; % Sampling step (min)

w=2*pi/OrbitalT; 
F_hor_alb = zeros(ceil(simtime));
F_ver_alb = zeros(ceil(simtime));

for t = 1:simstep:ceil(simtime)
    if cos(w*t*60)>shadow
        F_hor_alb = F_hor*cos(w*t*60);
        F_ver_alb = F_ver*cos(w*t*60);
    else
        F_hor_alb = 0;
        F_ver_alb = 0;
    end

    F_hor_alb(t) = F_hor_alb;
    F_ver_alb(t) = F_ver_alb;
    coseno(t)=cos(w*t*60);
    t=t+1;
end

【问题讨论】:

  • 如何定义shadow、F_hor和F_ver?
  • 另外,我不确定你想在这些行中做什么:F_hor_alb(t) = F_hor_alb; F_ver_alb(t) = F_ver_alb; coseno(t)=cos(w*t*60); t=t+1; t 应该在 for 循环中递增,没有必要告诉 Matlab 给 t 加一。
  • 'F_hor_alb = zeros(ceil(simtime)); F_ver_alb = zeros(ceil(simtime));'您在这里期望什么大小的矩阵?如果你想要一个向量,你需要这样定义:'F_hor_alb = zeros(ceil(simtime),1); F_ver_alb = zeros(ceil(simtime),1);'
  • 角度以弧度为单位,而不是函数cos 的度数。使用cosd 表示度数。那 60 是可疑的
  • 这段代码有很多问题,我所能做的就是建议你快速介绍一下MATLAB。如果你以正确的方式学习它,你的生活会轻松很多,而不是组装随机语法并询问它为什么不起作用。例如:matlabacademy.mathworks.com

标签: matlab for-loop if-statement trigonometry


【解决方案1】:

我不得不对您的代码进行一些更改。

您似乎在理解 Matlab 中 for 循环的工作原理时遇到了一些麻烦。

Re = 6378; % Radius of Earth (km)
z = 500; % Orbital Altitude (km)
mu = 3.986004415e5 % Gravitational constan of Earth (km3/s2)
OrbitalT = 2*pi*sqrt(((Re+z)^3)/mu); % Orbital Period (s)
orbits = 30; % Number of cycles for the simulation
simtime = (OrbitalT*orbits)/60; % Simulation time (min)
simstep = 1; % Sampling step (min)

w=2*pi/OrbitalT;

F_hor = 1;
F_ver = 2;
shadow = 0.5;

t = (1:simstep:ceil(simtime))';
F_hor_alb = nan(size(t));
F_ver_alb = nan(size(t));
coseno = nan(size(t));

for i = 1:length(t)
    if cos(w*t(i)*60)>shadow
        disp('here');
        F_hor_alb(i) = F_hor*cos(w*t(i)*60);
        F_ver_alb(i) = F_ver*cos(w*t(i)*60);
    else
        F_hor_alb(i) = 0;
        F_ver_alb(i) = 0;
    end

    coseno(i)=cos(w*t(i)*60);
end

【讨论】:

  • 你确实帮我解决了这个问题,但我实际上改变了我以前的代码的几点。您定义的变量已在代码的其他部分中定义。我没有在序言中使用 nan,因为它是一个轻量级的模拟,应该没有必要。你帮我去掉了一点锈=)。谢谢! for t = 1:simstep:ceil(simtime) if cos(w*t*60)>shadow F_hor_alb(t) = F_hor*cos(w*t*60); F_ver_alb(t) = F_ver*cos(w*t*60); else F_hor_alb(t) = 0; F_ver_alb(t) = 0; end coseno(t)=cos(w*t*60); end
  • nan 是一种很好的做法,可以将作为实际零的零与意外工作的代码区分开来。这会给你一个提示,代码没有按你预期的那样工作;)
  • 或者,如果你想“节省”一些 CPU,你可以使用零。然后您只需执行以下操作:if cos(w*t(i)*60)>shadow disp('here'); F_hor_alb(i) = F_hor*cos(w*t(i)*60); F_ver_alb(i) = F_ver*cos(w*t(i)*60); end。使用这种方法可以避免使用 else 并避免一次赋值操作。话虽如此,我更喜欢使用 nan 的方法,因为它使整个事情更加明确。
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2018-05-23
  • 2018-03-10
  • 2021-12-31
  • 2015-05-15
  • 2016-07-31
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多