为大量输入参数运行函数的清洁方法(在Matlab中)

时间:2017-06-08 23:07:22

标签: matlab function numerical-methods differential-equations

我有一个微分方程,它是大约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. 如果我想查看不同参数的微分方程的解,我必须重新定义函数,使其成为其他三十个参数之一的输入。为了代码可读性,我不能看到自己明确地将所有输入参数写为单独的输入。 (虽然我已经读过这里的结构可能会有所帮助,但我不确定如何实现。)

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

  3. 我正试图找出一个很好的方法让我跟踪一切。我试图想出一种智能方法来保存生成的数字,文件标签显示与该数字相关的所有参数。我可以将这样的文件保存为带有通用标记号的记事本文件,该标记列在图的标题中,但我觉得这是一个笨拙的系统。它特别尴尬,因为很难看出30多个参数的长列表有什么不同。

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

1 个答案:

答案 0 :(得分:0)

看起来你真正想要的是处理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

如果它们的大小不同,那么结构或表可能是最好的方法,因为你可以为每个循环迭代分配一个struct数组元素,或者每个循环分配一个表的一行迭代(表方法假设变量的大小不会从迭代变为迭代)。

如果由于某种原因,你真的需要将它们作为单独的输出(后来可能作为单独的输入),那么你可能需要的是一个单元阵列。在这种情况下,您可以处理可变数量的输入,例如

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

我甚至不愿意写这个,因为这几乎肯定是你正在尝试做的错误的数据结构。