我正在尝试通过for
循环中的反复试验方法来绘制重力异常。我有一个由圆体引起的重力异常gal1
的公式,下面,我试图更改质量(m
)和重心深度({{1 }}),以便为插入的不同h
和m
绘制重力异常的每个值。
发生的事情是,它不会使用h
绘制任何值,而仅在我执行plot(x,gal1(j)
时绘制一个值。我期望它可以绘制循环中每次迭代的值,以便针对不同的plot(x,gal1)
gal1
答案 0 :(得分:2)
问题在于,Adam mentioned每次绘制一个点而不是一个完整的数组,因此会导致错误。相反,请计算整个数组gal1
,然后然后将其完整绘制。
x=[-3 ; -2.5; -2; -1.5; -1; -0.5; 0; 0.5; 1.5];
for j=1:9
for i = 10:10:90
for k = 10:10:90
h(i)=i/100;
m(k)=k/100;
gal1(j)=(6.67 * (m(k)) * (h(i))/(x(j, 1)^2 + (h(i)) ^2)^(3/2));
end
end
end
figure;
plot(x,gal1,'-o') % - means a line, o gives dots on each measurement
结果:
与简单的矢量化计算相比,所有这些循环都过于冗长,难以理解,易于出错,并且可能比以下循环慢:
x=[-3 ; -2.5; -2; -1.5; -1; -0.5; 0; 0.5; 1.5];
h = (0.1:0.1:0.9).';
m = (0.1:0.1:0.9).'; % =h?
gal1 = 6.67.*m.*h./((x.^2+h.^2).^(3/2));
figure;
plot(x,gal1,'-o') % Same figure as above
请注意,您需要事先创建h
和m
(尽管在这种情况下它们是相等的?),请确保将它们转置为列向量,就像您拥有x
一样。然后,只需对gal1
使用相同的公式,并通过在所有*, /, ^
运算符前面添加点,就可以删除所有索引并用其元素对应的运算符替换运算符。
使用一些隐式扩展魔术,您甚至可以直接绘制h
和m
的所有组合:
x=[-3 ; -2.5; -2; -1.5; -1; -0.5; 0; 0.5; 1.5];
h = (0.1:0.1:0.9).';
m = (0.1:0.1:0.9); DO NOT transpose this
gal1 = 6.67.*m.*h./((x.^2+h.^2).^(3/2)); % is now 9x9
figure;
plot(x,gal1,'-o')
legend
为每列提供一个图,即不同的h
值: