使用符号matlab实现灵活的参数和函数数量
我有一个函数F,它把向量a作为输入。函数的输出和a都是长度为N的向量,其中N是任意的。每个组件Fn的形式为g(a(n),a(n-k)),其中g对于每个组件是相同的 我想用它的符号功能在matlab中实现这个函数,并计算它的雅可比矩阵(然后用使用符号matlab实现灵活的参数和函数数量,matlab,symbolic-computation,Matlab,Symbolic Computation,我有一个函数F,它把向量a作为输入。函数的输出和a都是长度为N的向量,其中N是任意的。每个组件Fn的形式为g(a(n),a(n-k)),其中g对于每个组件是相同的 我想用它的符号功能在matlab中实现这个函数,并计算它的雅可比矩阵(然后用matlabFunction将函数及其雅可比矩阵存储为一个常规的.m文件)。我知道如何对每个输入都是可以手动处理的标量的函数执行此操作。但在这里,我想要一个脚本,能够为任何N生成这些文件。有没有一个好的方法来做到这一点 我提出的一个解决方案是生成一个字符串数组
matlabFunction
将函数及其雅可比矩阵存储为一个常规的.m文件)。我知道如何对每个输入都是可以手动处理的标量的函数执行此操作。但在这里,我想要一个脚本,能够为任何N生成这些文件。有没有一个好的方法来做到这一点
我提出的一个解决方案是生成一个字符串数组“a0”、“a1”、“an”,并使用eval
定义输出的每个组件。但这很混乱,我想知道是否有更好的方法
谢谢大家!
[编辑]
以下是我当前解决方案的一个最简单的工作示例:
function F = F_symbolically(N)
%generate symbols
for n = 1:N
syms(['a',num2str(n)]);
end
%define output
F(1) = a1;
for n = 2:N
F(n) = eval(sprintf('a%i + a%i',n,n-1));
end
试试这个:
function F = F_symbolically(N)
a = sym('a',[1 N]);
F = a(1);
for i=2:N
F(i) = a(i) + a(i-1);
end
end
请注意使用sym
函数(而不是syms
)创建符号变量数组。尝试以下操作:
function F = F_symbolically(N)
a = sym('a',[1 N]);
F = a(1);
for i=2:N
F(i) = a(i) + a(i-1);
end
end
请注意使用
sym
函数(而不是syms
)创建符号变量数组。请在您的问题中加入一些示例代码来演示您的问题,可以是固定数量参数的版本,也可以是您的eval
解决方案。我确信它可以做得更好,但我不知道我是否需要解释逗号分隔列表,符号工具箱如何处理向量,或者两者兼而有之。这很糟糕。MATLAB有几种非常适合此任务的数据容器格式,如结构。您是否知道语法:a=sym('a',[1 N])
,然后可以作为a(i)
访问?谢谢您的回复@丹尼尔,我添加了一个最小的工作示例。阿德里安,我完全同意,因此我的问题;)你链接的问题确实很有趣,但我没有发现任何关于符号功能的东西。你有没有关于如何在没有eval
的情况下完成上述工作的示例?@Amro没有,我不是:P这就成功了!非常感谢。请在您的问题中加入一些示例代码来演示您的问题,可以是固定数量参数的版本,也可以是您的eval
解决方案。我确信它可以做得更好,但我不知道我是否需要解释逗号分隔列表,符号工具箱如何处理向量,或者两者兼而有之。这很糟糕。MATLAB有几种非常适合此任务的数据容器格式,如结构。您是否知道语法:a=sym('a',[1 N])
,然后可以作为a(i)
访问?谢谢您的回复@丹尼尔,我添加了一个最小的工作示例。阿德里安,我完全同意,因此我的问题;)你链接的问题确实很有趣,但我没有发现任何关于符号功能的东西。你有没有关于如何在没有eval
的情况下完成上述工作的示例?@Amro没有,我不是:P这就成功了!非常感谢。不确定OP示例的代表性如何,但函数体可以替换为F=cumsum(sym('a',[1n])代码>。不完全是这样,上面的函数只是计算当前项和以前项的总和,而不是从一开始就累加计算。。无论如何,向量化并不是这里的主要关注点,我相信我们可以用类似于F=[a(1),a(1:end-1)+a(2:end)]的东西来实现,不确定OP的例子有多具有代表性,但是函数体可以被F=cumsum(sym('a',[1n])代替代码>。不完全是这样,上面的函数只是计算当前项和以前项的总和,而不是从一开始就累加计算。。无论如何,矢量化不是这里的主要关注点,我相信我们可以用F=[a(1),a(1:end-1)+a(2:end)]