Вывод информации

Форум, посвященный общим вопросам, связанным с MATLAB

Модератор: Admin

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Вывод информации

Сообщение aBoomest » Вт июн 04, 2019 9:54 pm

Добрый день.
Иногда случается, что вычислений очень много, в том числе и вычисления с итерациями. Более того с переменным количеством итераций. Решения в цикле нескольких дифуров с разными параметрами. Вообще это я к тому, что иногда выполнение скрипта занимает несколько минут. Иногда, когда ждешь начинает казаться что все "повисло". Чтобы понять как идет процесс и на кокой он стадии я вывожу информацию в comand window (ф-ция disp()), например самое простое после каждой итерации информацию о шаге. Операция вывода в командное окно явно занимает много времени так, что значительно увеличивает общее время выполнения скрипта, которое и без того не малое.
1. Есть ли какие-то менее затратные способы записи "лога" в командном окне?
2. Может существует лит-ра или может где-то собрана инфа о каких-то типичных способах делать типичные операции в матлаб именно определенным способом, чтобы они занимали наименьшее время. Т.е. типа советы по увеличению быстродействия.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Ср июн 05, 2019 4:25 pm

Вот в дополнение к предыдущему посту такой конкретный вопрос:
есть довольно громоздкое аналитическое выражение на выходе которого комплексное число. Это выражение в скрипте вычисляется несколько сотен тысяч раз, а может и миллионы, не оценивал. Так вот, в каком случае скрипт выполнится быстрее, если вычисляется комплексное выражение с комплексными числами, или если я сам выведу две формулы: для действительной и мнимой части отдельно, и переделаю функцию так, чтоб вместо одного вычисления в комплексных величинах были два вычисления в с вещественными числами?
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5544
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Вывод информации

Сообщение sandy » Ср июн 05, 2019 7:52 pm

Скорее всего без разницы. Вы в профайлере-то смотрели, на что время тратится?
С уважением

Александр Сергиенко

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Чт июн 06, 2019 2:58 pm

Добрый день.
Какраз сегодня хотел задать вопрос про это. В скрипте порядка тысячи раз (ниже в примере 600 раз) вызывается решение уравнения с помощью функции ode45. На нее тратится просто немерено времени и памяти. Все остальное ничтожно малое время по сравнению с этим.
Изображение
Изображение
Что с этим можно сделать, ибо это же ф-ция встроенная ее не поменяешь?
При этом если сделать 200 вызовов а не 600, то время уменшается далеко не пропорционально.
Изображение
Еще вопрос как именно происходит работа ф-ции ode45?
Вопрос вот в чем: у меня есть система из 2х уравнений
Изображение
Т.е. второе уравнение зависит от решения первого.
Мне надо решить первое уравнение на заданном интервале расчета, получить конкретное число, а потом подставить это во второе уравнение? Это же вроде не так, система уравнений как я понимаю должна решаться совместно, т.е. на каждой итеррации. Т.е. чейчас это у меня реализовано внутри одной функции ode45. Как правильно?

Код: Выделить всё

function dy = CalcDiffEquSys(x,y,Number)   
  global Profil;
  dy = zeros(2,1);   
  k = Number;

  nn1 = fix(x/Profil(end,1)*(Count-1)+1);
  if nn1 ~= Count
      xx1 = Profil(nn1,1);
      xx2 = Profil(nn1+1,1);
      yy1 = Profil(nn1,2);
      yy2 = Profil(nn1+1,2);
      kk = (yy2-yy1)/(xx2-xx1);
      pr = kk*(x-xx1)+yy1;
  else
      pr = Profil(nn1,2);
  end
 
  kpr = k*pr;
  kpr_2 = kpr/2;
 
  dy(1) = -2*k*y(1)-kpr*y(1)-kpr*y(1)*y(1);          % ур-е 1
  dy(2) = -k*y(2)-kpr_2*y(2)-kpr_2*y(1)*y(2);      % ур-е 2
end
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5544
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Вывод информации

Сообщение sandy » Чт июн 06, 2019 11:12 pm

В скрипте порядка тысячи раз (ниже в примере 600 раз) вызывается решение уравнения с помощью функции ode45. На нее тратится просто немерено времени и памяти.

Ну а чего вы хотите, если вы тысячу раз численно решаете систему ДУ? Это в принципе не может быть быстро. Больше всего времени, кстати, тратится не на ode45, а на вашу функцию CalcDiffEquSys.
если сделать 200 вызовов а не 600, то время уменшается далеко не пропорционально.

Уж не знаю, чем отличался набор условий при этих 200 вызовах от предыдущих 600, но из данных профайлера видно, что число вызовов функции, описывающей систему, уменьшилось не в 3 раза, а почти в 10.
Мне надо решить первое уравнение на заданном интервале расчета, получить конкретное число, а потом подставить это во второе уравнение?

Не знаю. Так как у вас не полноценная система, а первое уравнение является независимым от второго, можете попробовать и так сделать, вдруг заметно быстрее окажется. По идее, решать два отдельных уравнения должно быть проще, чем систему.

P.S. откуда внутри вашей функции берется значение переменной Count, осталось загадкой.
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Пт июн 07, 2019 9:35 am

sandy писал(а):Ну а чего вы хотите, если вы тысячу раз численно решаете систему ДУ? Это в принципе не может быть быстро. Больше всего времени, кстати, тратится не на ode45, а на вашу функцию CalcDiffEquSys.
Так это же и есть....... или я скорее всего что-то не понимаю, это же получается "тело процедуры" решения системы д.у.???
sandy писал(а):Уж не знаю, чем отличался набор условий при этих 200 вызовах от предыдущих 600, но из данных профайлера видно, что число вызовов функции, описывающей систему, уменьшилось не в 3 раза, а почти в 10.
Условие меняется одно - разная частота сигнала входа. (остальное: длина сигнала, дискретизация сигнала и т.п. одинаковые, и н.у. одинаковые, и все остальное одинаковое.)
sandy писал(а):
Мне надо решить первое уравнение на заданном интервале расчета, получить конкретное число, а потом подставить это во второе уравнение?

Не знаю. Так как у вас не полноценная система, а первое уравнение является независимым от второго, можете попробовать и так сделать, вдруг заметно быстрее окажется. По идее, решать два отдельных уравнения должно быть проще, чем систему.
1. А как правильно?
2. Получается то, что я из первого уравнение я нахожу сперва конечное значение (в конце интервала) и это число туда подставляю или надо всю функцию на интервале передавать? Если всю - то как быть с тем, что у меня например получилась какая-то конкретная ф-ция y1 и я ее передал во второе уравнение. Но вряд ли же будут шаги интегрирования совпадать? Мне получается еще при решении второго уравнения еще и интерполяцию будет делать чтоб для конкретного шага?
sandy писал(а):P.S. откуда внутри вашей функции берется значение переменной Count, осталось загадкой.
Пардон, случайно стер. Но в принципе это не суть важно.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5544
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Вывод информации

Сообщение sandy » Пт июн 07, 2019 7:38 pm

1. А как правильно?

Боюсь, на этот вопрос нет однозначного ответа. Что дает лучшие результаты, то и правильно.
или надо всю функцию на интервале передавать?

Функцию, конечно.
Мне получается еще при решении второго уравнения еще и интерполяцию будет делать чтоб для конкретного шага?

Да.
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Вс июн 09, 2019 9:07 am

sandy писал(а):Боюсь, на этот вопрос нет однозначного ответа. Что дает лучшие результаты, то и правильно.
Главное что даст правильные результаты?
sandy писал(а): Больше всего времени, кстати, тратится не на ode45, а на вашу функцию CalcDiffEquSys.
Что тут можно сделать? Я вобще не совсем понимаю разделения. ODE - решатель. А Вот в функции CalcDiffEquSys я описываю определенным образом свою систему уравнений. В ней же нет какого-то решения, это просто описание (как я понимаю), а решение происходит в функции ODE. Как на функцию CalcDiffEquSys при этом тратится столько времени - ??????
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5544
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Вывод информации

Сообщение sandy » Вс июн 09, 2019 3:36 pm

Как на функцию CalcDiffEquSys при этом тратится столько времени - ??????

Ну так она вызывается 2.7 миллиона раз. Результаты профайлера для этой функции вы не показали, но в ее коде вроде не видно очевидных возможностей для оптимизации. Разве что со способами передачи массива Profil можно поэкспериментировать.
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Пн июн 10, 2019 11:26 am

sandy писал(а):Результаты профайлера для этой функции вы не показали
Еслиб я знал как это сделать? (Профайлером конечно пользуюсь время от времени, но я с ним толь на "ВЫ".)
sandy писал(а):Разве что со способами передачи массива Profil можно поэкспериментировать.
Не пойму пока как? Он же глобально объявлен. Лишнего времени на создание копий переменных нет. Вроде как наоборот все максимально быстро. Есть еще какие-то способы?
Последний раз редактировалось aBoomest Вт июн 11, 2019 10:32 am, всего редактировалось 1 раз.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5544
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Вывод информации

Сообщение sandy » Пн июн 10, 2019 8:33 pm

С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Вт июн 11, 2019 10:29 am

Добрый день. Спасибо.
НУ ничего себе. А я только в прошлом месяце какраз дополнительную информацию про профайлер искал, и заодно просмотрел серию лекций на матлабовском канале (https://www.youtube.com/user/MATLABinRussia/about), где в одной из лекций ясно говорилось, что передача глобального параметра ускоряет процесс вычислений.
sandy писал(а):Результаты профайлера для этой функции вы не показали
Не подскажете ссылку где написано как это сделать, что-то никак не нахожу. Или книгу. Или просто как это сделать.
С уважением, Анатолий.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Вт июн 11, 2019 12:44 pm

Я неожиданно понял почему про это нигде не написано, потому что достаточно кликнуть на имя функции в таблице.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

aBoomest
Пользователь
Сообщения: 256
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: Вывод информации

Сообщение aBoomest » Чт июн 13, 2019 5:39 pm

Добрый день.
Посмотрел по функциям. На данных картинках расчет идет 647 сек
Изображение
При этом 645 сек выполняется ode45
а конкретннее функция feval находящаяся внутри ode45 и вызываеемая там несколько раз (см.ниже)
Изображение
Не могли бы подсказать что с этим можно сделать?
Вобще на эти функции получается тратится примерно 2/3 времени.
еще 52 сек тратится на ntrp45, которая также находитсся внутри ode45.

Также порядка 50 сек занимает у меня своя функция интерполяции:
Т.е. задана таблично функция по которой я интегрирую, и в зависимости от аргумента, который приходит на вход ode45 на данной итерации ( в процессе решения дифура), определяю значение функции в конкретной точке (икс). Примечание: использование вместо самопальной функции, стандартной interp1 на много ухудшает ситуацию.

Видны ли тут какието выходы из ситуации, решения?
Спасибо.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5544
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Вывод информации

Сообщение sandy » Чт июн 13, 2019 6:58 pm

Не могли бы подсказать что с этим можно сделать?

С этим - ничего. Если, конечно, вы не собираетесь писать собственный решатель ДУ.
Также порядка 50 сек занимает у меня своя функция интерполяции:

Вы не показали результаты профилирования ни по ней, ни по CalcDiffEquSys.
использование вместо самопальной функции, стандартной interp1 на много ухудшает ситуацию

Да, если в программе нужно очень много раз получить ОДНО интерполированное значение, interp1 использовать не стоит - накладные расходы на ее служебные фрагменты слишком велики.
С уважением



Александр Сергиенко