【问题标题】:MATLAB: how to discretize a function of 10 variables (currently using ndgrid and arrayfun)?MATLAB:如何离散化 10 个变量的函数(目前使用 ndgrid 和 arrayfun)?
【发布时间】:2016-03-16 17:18:44
【问题描述】:

我有一个函数

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

我想离散化。我将执行涉及此函数的优化,我认为优化的效率将受益于离散函数,然后对数据进行样条插值,而不必评估连续函数。本质上,我希望 output1 和 output2 中的每一个都有一个 10 维双精度,它们与 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 个变量的函数的问题完全难以解决?

【问题讨论】:

  • 那么,你想运行你的函数1e20 次吗?如果每个都需要一毫秒,那么您将运行 数千 年。优化是数学中一个巨大的领域的原因是为了避免做这样的事情......
  • 我基本上是在想一种方法来收集这个函数的数据(稍后用于插值),而不需要大量的数据点。
  • 破旧的东西是开始的方法。
  • 所以本质上这个函数的变量太多了,没有办法离散化吗?
  • 您在这里使用了错误的术语,您不是在“离散化”。您正在尝试评估函数 1e20 次。如果你想优化它,那是数学中的一个巨大领域,没有人通过给出值并查看哪个是最小值来解决它。如果这是可能的,那么今天将解决大量未解决的问题

标签: matlab function memory matrix discretization


【解决方案1】:

你走错了路。假设你有无限的内存,你会在最后一行调用你的函数 100^10 次。那将需要很多时间。没有合理的优化策略会多次调用您的函数,这就是开发所有这些复杂策略的原因。

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

【讨论】:

  • 明确一点,我的意思是预先计算这个函数,这样优化只需要查找表(并且可以插值)而不是连续函数。所以是的,重点,我会看看我是否可以在部分功能上使用这个策略。
  • 创建查找表所花费的时间比您的搜索策略评估函数所花费的时间要多的目的是什么?
  • 一个目的是能够使用样条插值来保证一定的平滑度,但另一个目的(主要目的)是缩短优化时间。我宁愿创建一个查找表一次(甚至花费相当长的时间),然后能够多次运行优化(因为它会更快)。但当然,我实际上需要能够在合理的时间内创建查找表。我想这是不可行的。
  • 是为了缩短优化时间,是的,如果你需要数千年的时间来计算可能的解决方案,优化时间将会更短。 @user178831
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2019-02-04
  • 1970-01-01
  • 2012-11-16
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多