0

我的代码是:

T=[0:0.1:24];
omega=((12-T)/24)*360;
alpha = [0:1:90];
latitude=35;
delta=[-23.45:5:23.45];
sind(alpha)=sind(delta).*sind(latitude)+cosd(delta).*cosd(latitude).*cosd(omega)
cosd(phi)=(sind(alpha).*sind(latitude)-cosd(delta))./(cosd(alpha).*cosd(latitude))

alpha 代表我的 y 轴,是 0 到 90 度之间的角度。phi 代表我的 x 轴,是介于 -120 到 +120 之间的角度。整体结果应该看起来像半正弦波。

每当我尝试输入最后一行时,我都会收到错误消息,指出内部矩阵尺寸必须一致。因此,我尝试在我的矩阵上对我定义的那些变量使用 reshape,以便它们起作用。但后来我得到'??? ???下标索引必须是真正的正整数或逻辑。

每次我定义一组新变量以便将它们与方程一起使用时,都必须重塑我的矩阵似乎非常乏味。这些变量用于定义我的轴范围,有没有更好的方法可以布置它们,或者有一个自动命令可以确保它们每次都工作?

我想使用类似的东西将 alpha 和 phi 绘制为图形

plot(alpha,phi) 

但无法克服这些错误?我不能只使用类似定义 x 轴 [0:90]、定义 y 轴 [-120:120] 之类的命令吗?我在这个问题上花了太多时间,找不到解决方案。我只想绘制图表。有人请帮忙!谢谢。

谢谢

4

3 回答 3

1

逐元素乘法 ( .*) 和除法./,而不是矩阵版本:

sind(alpha)=sind(delta).*sind(latitude)+cosd(delta).*cosd(latitude).*cosd(omega)
cosd(phi)=(sind(alpha).*sind(latitude)-cosd(delta))./(cosd(alpha).*cosd(latitude))

但更大的问题是您不能使用小数或非正值进行索引。在出现下标索引错误之前返回代码。索引“必须是真正的整数或逻辑”。

于 2013-10-16T00:17:14.687 回答
1

这是一个开始:

% Latitude
L=35;

% Hour Angle
h = [-12:5/60:12];
w = 15*h;

% Initialize and clear plot window
figure(1); clf;

% Plot one day per month for half of the year
for N = 1:30:365/2
    % Declination
    d = 23.45*sind(360*(284+N)/365);

    % Sun Height
    alpha = asind(sind(L)*sind(d) + cosd(L)*cosd(d)*cosd(w));

    % Solar Azimuth 
    x = ( sind(alpha)*sind(L)-sind(d) )./( cosd(alpha)*cosd(L) );
    y = cosd(d)*sind(w)./cosd(alpha);
    phi = real(atan2d(y,x));

    % Plot
    plot(phi,alpha); hold on;
end

hold off;
grid on;
axis([-180, 180, 0, 90]);
xlabel('Solar Azimuth')
ylabel('Solar Elevation')

该函数asind本质上仅限于返回 -90 到 90 范围内的值。这意味着您不会得到像您链接到的那样跨越 240 度的图。为了使绘图不具有 +/- 90 度的拐点,您需要找到一种方法来推断象限。更新:我添加了余弦项以使用atan2d. Matlab 绘图

希望这足以让您了解如何使用 Matlab 来获得您所追求的结果。

于 2013-10-16T15:11:51.983 回答
0

我认为您对 MATLAB sintax (如 nispio 提到的)有点困惑。也许你想做这样的事情?

T=[0:0.1:24];
omega=((12-T)/24)*360;
alpha = [0:1:90];
latitude=35;
delta=[-23.45:5:23.45];
[o1,d1]=meshgrid(omega,delta);
[a2,d2]=meshgrid(alpha,delta);
var1=sind(d1(:)).*sind(latitude)+cosd(d1(:)).*cosd(latitude).*cosd(o1(:));
var2=(sind(a2(:)).*sind(latitude)-cosd(d2(:)))./(cosd(a2(:)).*cosd(latitude));
plot(var1);hold on;plot(var2);

如果没有,您应该发布算法或伪代码

于 2013-10-16T14:02:40.190 回答