2016-03-16 2 views
0

У меня есть функцияMATLAB: как дискретизировать функцию из 10 переменных (в настоящее время используется ndgrid и arrayfun)?

function [output1 output2] = func(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10) 

, что я хочу, чтобы дискретизацию. Я собираюсь выполнить оптимизацию, которая включает эту функцию, и я думаю, что эффективность оптимизации выиграет от дискретизации функции, а затем сделает сплайн-интерполяцию данных вместо того, чтобы оценивать непрерывную функцию. По сути, я хотел бы получить 10-D double для каждого из output1 и output2, который коррелирует с различными значениями v1, v2, ... v10.

С бесконечного времени и памяти, я бы сделать следующее:

n_pts = 100; 

v1 = linspace(v1_min, v1_max, n_pts); 
... 
v10 = linspace(v10_min, v10_max, n_pts); 

[v1g v2g ... v10g] = ndgrid(v1, v2, ... v10); 

[output1, output2] = arrayfun(@func, v1g, v2g, ... v10g); 

времени и памяти (необходимо для выполнения ndgrid и arrayfun), очевидно, не позволяют этого. Может ли кто-нибудь подумать о работе, или эта проблема дискретизации функции из 10 переменных полностью неразрешима?

+1

Итак, вы хотите запустить функцию '1e20' раз? Если каждый займет миллисекунду, вы будете использовать это для * тысяч * лет. Оптимизация причины - огромное поле в математике - это избегать подобных действий .... –

+0

Я в основном пытаюсь понять, как я могу собирать данные по этой функции (для интерполяции позже), не требуя смешной суммы точек данных. – user178831

+0

Поврежденная вещь - это подход к началу. –

ответ

0

Вы находитесь на совершенно неправильном пути. Предполагая, что у вас есть бесконечная память, вы бы назвали вашу функцию 100^10 раз в последней строке. Это потребует много времени. Никакая разумная стратегия оптимизации не будет называть вашу функцию много раз, вот почему все эти сложные стратегии разрабатываются.

Вы можете использовать свою стратегию, чтобы предварительно вычислить интенсивные подынтеры для вашей функции. Замена очень дорогостоящего термина только тремя переменными с помощью таблицы поиска 100^3 может значительно увеличить производительность, не используя много памяти.

+0

Чтобы быть ясным, моя задача - предварительно вычислить эту функцию, чтобы оптимизировать только таблицу поиска (и можно интерполировать ее) вместо непрерывной функции. Итак, да, сделанный пункт, я посмотрю, смогу ли я использовать эту стратегию для частей функции. – user178831

+0

Какова цель создания таблицы поиска занимает больше времени, чем ваша стратегия поиска для оценки функции? – Daniel

+0

Одна из целей - использовать сплайн-интерполяцию, чтобы гарантировать определенный уровень гладкости, но другая цель (основная) заключалась в том, чтобы сократить время оптимизации. Я бы предпочел создать таблицу поиска один раз (даже занимая достаточно долгое время), а затем мог бы выполнять оптимизацию несколько раз (так как это было бы быстрее). Но, конечно, мне нужно действительно создать таблицу поиска в разумные сроки. Думаю, это невозможно. – user178831

Смежные вопросы