Matlab падает после запуска длинного цикла for - PullRequest
0 голосов
/ 12 января 2019

Я выполняю этот простой код, где я вычисляю некоторые значения в формуле, и он генерирует новые значения в вектор. Проблема в том, что он работает около 5 минут, а затем вылетает. Я бы уменьшил количество итераций, но это для задания, и мне нужно отобразить все результаты. Есть предложения?

Я пытался предварительно выделить память, но это не помогло

clc
clear

G = 6.67*10^-11; % N*m^2*kg^-2
r = 6378*1000; % m
R = 100000*1000; % m
M = 5.97*10^24; % kg
d = R-r; %m


a = zeros(1,d);
for i = 1: d
a(i) = G*(M/i^2);
end
plot(d,a);

1 Ответ

0 голосов
/ 12 января 2019

Очевидно, вы изучаете закон гравитации.

Проблема 1: Ваша переменная d является скалярной, вы наносите ее на вектор a длины d = 93622. Вы хотите построить a как функцию значений 1:d. Это не удается из-за ограничений памяти.

Проблема 2: гравитационная сила стремится к нулю очень быстро из-за члена 1 / (r ^ 2). Вы пытаетесь увидеть все эффекты, нанося на график функцию с шагом 1 метр, что является слишком точной дискретизацией в астрономическом масштабе. Если вы дискретизируете с разрешением 1000 м = 1 км, MATLAB предоставит вам участок:

i = 1:1000:d;
a = G*(M./(i.^2));
plot(i,a);

Однако в этой шкале вы мало что узнаете, функция практически равна нулю очень скоро. Так что либо разделите диапазон вашего графика на диапазон около Земли, и второй диапазон в космосе. Или выведите график силы, чтобы увидеть изменение на несколько порядков.

Оценка эффективности: Вы должны использовать векторизацию вместо for - циклов, где это возможно и понятно, это идиоматический MATLAB, короче и обычно быстрее. Вам потребуется точка-оператор для компонентного деления и силовых операций, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...