【问题标题】:Clean methodology for running a function for a large set of input parameters (in Matlab)为大量输入参数运行函数的清洁方法(在 Matlab 中)
【发布时间】:2017-06-08 23:07:22
【问题描述】:

我有一个微分方程,它是大约 30 个常数的函数。微分方程是 (N^2+1) 个方程组(其中 N 通常为 4)。求解这个系统会产生 N^2+1 个函数。

我经常想看看微分方程的解在函数上是如何依赖于常数的。例如,我可能想绘制一个输出函数的最大值,并查看当我线性增加一个输入常数时,该最大值如何随着微分方程的每个解而变化。

有没有特别干净的方法可以做到这一点?
现在,我将我的微分方程求解脚本变成了一个返回输出函数数组的大函数。 (一些输入是向量和矩阵)。例如:

for i = 1:N
[OutputArray1(i, :), OutputArray2(i, :), OutputArray3(i, :), OutputArray4(i, :), OutputArray5(i, :)] =  DE_Simulation(Parameter1Array(i));
end

在这里我循环遍历函数。该函数求解一个微分方程,然后返回该输入参数的一组解函数,然后将每个函数作为一行附加到矩阵中。

我的方法存在一些问题:

  1. 如果我想查看不同参数的微分方程的解,我必须重新定义函数,使其成为其他 30 个参数之一的输入。为了代码的可读性,我看不到自己将所有输入参数显式地写为单独的输入。 (虽然我读过结构在这里可能会有所帮助,但我不确定如何实现。)

  2. 我通常会迷失在参数空间中,并且经常需要跨多个脚本更新相同的参数。我有一个运行微分方程求解函数的脚本,我有一个绘制一组模拟数据的第二个脚本。 (并且我会将局部变量保存到一个文件中,以便我可以显式加载它们以进行绘图,但我经常迷失在弄清楚哪个文件与哪组参数相关联)。不在函数输入中的其余参数在函数本身内部。我尝试将参数设为全局,但这样做会大大降低代码的速度。此外,一些输入是我想在运行求解器之前绘制和查看的数组。 (有些输入是时间相关的边界条件,我经常想先看看它们是什么样子的。)

  3. 我正在尝试找出一种让我跟踪所有内容的好方法。我试图想出一种聪明的方法来保存生成的图形,文件标签显示与该图形关联的所有参数。我可以将这样的文件保存为记事本文件,并在图的标题中列出一个通用的标记号,但我觉得这是一个尴尬的系统。这特别尴尬,因为很难看出一长串 30 多个参数的不同之处。

总的来说,我觉得我正在做的事情相当简单,但我觉得我没有一个好的编码方法,因此最终浪费了大量时间来节省几乎相同的功能和脚本来解决相当简单的任务。

【问题讨论】:

    标签: matlab function numerical-methods differential-equations


    【解决方案1】:

    看来您在这里真正想要的是处理 N-D 数组而不是拆分输出的东西。

    如果所有OutputArray_ 变量的行数相同,则行

     for i = 1:N
     [OutputArray1(i, :), OutputArray2(i, :), OutputArray3(i, :), OutputArray4(i, :), OutputArray5(i, :)] =  DE_Simulation(Parameter1Array(i));
     end
    

    似乎表明您真正希望函数返回的是 M x K 数组(在本例中,K = 5),并且您希望将该输出打包到 M x K x N 数组中。也就是说,您似乎想重构您的 DE_Simulation 以提供类似

     for i = 1:N
         OutputArray(:,:,i) = DE_Simulation(Parameter1Array(i));
     end
    

    如果它们的大小不同,那么结构或表可能是最好的方法,因为您可以在每次循环迭代时分配给结构数组的一个元素,或者每次循环迭代时分配给表的一行 (表格方法会假设变量的大小不会随着迭代而改变)。

    如果出于某种原因,您确实需要将它们作为单独的输出(可能稍后作为单独的输入),那么您可能想要的是一个元胞数组。在这种情况下,您将能够处理可变数量的输入,例如

     for i = 1:N
          [OutputArray{i, 1:K}] = DE_Simulation(Parameter1Array(i));
     end
    

    不过,我什至不愿写这个,因为对于您正在尝试做的事情来说,这几乎肯定是错误的数据结构。

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      相关资源
      最近更新 更多