首页 > 解决方案 > 使用 for 循环在同一图中绘制多个值

问题描述

我正在尝试通过for循环试验和错误的方法来绘制重力异常。我有以下由圆形物体引起的重力异常的公式gal1,我正在尝试更改循环中的质量 ( m) 和重心深度 ( h) 的值,以便绘制每个值重力异常为异mh插。

发生的情况是它不使用任何值plot(x,gal1(j)绘制,并且在我绘制时只绘制一个值plot(x,gal1)。我期望它绘制循环中每次迭代的值,以便我有不同的图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));
                plot(x,gal1(j))
                hold on
            end
        end
    end

标签: matlabfor-loopplot

解决方案


问题是,正如亚当所提到的,您每次都在绘制一个点与一个完整的数组,因此它导致了一个错误。相反,计算整个数组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

请注意,您创建handm之前(尽管在这种情况下它们是相等的?),请务必将它们转置为列向量,就像您拥有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值:

在此处输入图像描述


推荐阅读