2016-03-16 57 views
0

我有一个函数MATLAB:如何离散10个变量的函数(目前使用ndgrid和arrayfun)?

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

,我想离散。我将执行涉及此功能的优化,我认为优化的效率将从离散函数中受益,然后对数据执行样条插值,而不必评估连续函数。基本上,我想为输出1和输出2中的每一个都输出一个10-D double,它们与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

worng的东西是开始的方法。 –

回答

0

你是一个完全错误的道路。假设你有无限的内存,你可以在最后一行中调用你的函数100^10次。这将需要很多时间。没有合理的优化策略会多次调用你的功能,这就是所有这些复杂策略的开发原因。

您可以使用您的策略来预先计算函数的计算密集型子项。用100^3的查找表替换成本密集型的​​术语只有三个变量,可能会显着提高性能,而不会占用太多内存。

+0

只是要清楚,我的观点是预先计算此功能,以便优化只需要查找表(并可插值它),而不是连续函数。 所以是的,点了,我会看看如果我可以使用这个策略的部分功能。 – user178831

+0

创建查找表的目的是什么,比您的搜索策略需要更多时间来评估函数? – Daniel

+0

一个目的是能够使用样条插值来保证一定的平滑度,但另一个目的(主要目的)是缩短优化时间。我宁愿创建一次查询表(即使花费相当长的时间),然后能够多次运行优化(因为它会更快)。但是,当然,我需要真正能够在合理的时间内创建查找表。我想这是不可行的。 – user178831