matlab - 使用 for 循环在同一图中绘制多个值
问题描述
我正在尝试通过for
循环试验和错误的方法来绘制重力异常。我有以下由圆形物体引起的重力异常的公式gal1
,我正在尝试更改循环中的质量 ( m
) 和重心深度 ( h
) 的值,以便绘制每个值重力异常为异m
而h
插。
发生的情况是它不使用任何值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
解决方案
问题是,正如亚当所提到的,您每次都在绘制一个点与一个完整的数组,因此它导致了一个错误。相反,计算整个数组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
andm
之前(尽管在这种情况下它们是相等的?),请务必将它们转置为列向量,就像您拥有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
值:
推荐阅读
- kotlin - Google Cloud Functions 从应用程序发送错误的身份验证值
- perl - Perl 在使用警报超时时出现分段错误
- extjs - 无法布局复合字段项
- amazon-web-services - 无法从 AppSync 响应映射模板中的 RDS 序列化 AWSDate
- javascript - PHP function doesn't run the second time
- node.js - 如何将firebase会话cookie从服务器发送到前端
- javascript - 使用 window.onclick 隐藏 div 的问题
- python - 为什么 AttributeError: 'bytes' 对象没有属性 'findAll'
- artifactory - artifactory docker 存储库如何启用可变 docker 图像标记?
- visual-studio - .NET Core 3.0:ASPNETCORE_ENVIRONMENT 在发布时具有开发价值