如何在fminunc的函数句柄中创建多个未知变量

时间:2013-11-26 15:29:40

标签: matlab

只要symEq中的符号输入数为2,此代码就可以正常工作,这会产生一个带有两个参数的函数句柄x(1), x(2)

syms A   
A = sym('A', [2 1]);  
b = [1 2;3 4];  
c = [3 4];  
range = [1 1];  
symEq(A) = abs(sum(b*(A-c')));  
Eq = @(x) double(symEq(x(1), x(2)));  
[X,Y] = fminunc(Eq,range)

但是如果symEq中的符号输入更改为3,除非我将函数句柄更改为接受三个参数x(1), x(2), x(3),否则它将产生错误。

但是我需要参数的数量是一个任意数字,比方说510,并且函数句柄自动拥有多个参数:x(1), x(2), ... x(510),而不需要在代码中手动输入510个未知变量

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

嗯,有很多事情要说。

首先,如果最终得到的是数字,为什么要使用符号? Matlab可以进行符号计算,但它在数值方面表现优异,特别是在线性代数中。其他一些小问题是:您没有使用A给出的值,因为A以后只显示为参数,range是用词不当,因为它实际上是{{1}的初始值} {} A0找到最小值,而fminunc实际上是一个函数。

更重要的是,不需要分别引用Eq(实际上是x)的元素 - 矩阵是计算中的自然单位Matlab的。

更改所有这些内容会产生:

A

在此表单中,将代码扩展到更高维度是微不足道的:您只需要正确设置参数b = [1 2; 3 4]; c = [3 4]; A0 = [1 1]; fun = @(A) abs(sum(b * (A - c)')); [X, Y] = fminunc(fun, A0) b以及初始值c。对于三个维度,例如:

A0

对于510维度,使用随机初始化的参数作为示例:

b = [1 2 3; 4 5 6; 7 8 9];  
c = [3 4 5];  
A0 = [1 1 1];
fun = @(A) abs(sum(b * (A - c)'));  
[X, Y] = fminunc(fun, A0)

但还有更多:最小化函数的模数等同于最小化其平方:

b = rand(501, 501);  
c = rand(1, 501);  
A0 = ones(1, 501);  
fun = @(A) abs(sum(b * (A - c)'));  
[X, Y] = fminunc(fun, A0)

这是一个简单的最小二乘问题,使用fun = @(A) (sum(b * (A - c)')) .^ 2; 就是矫枉过正。此外,在这种特定情况下,找到的解决方案总是处于函数值0,这在fminunc为零时实现。所以整个最小化归结为:

A - c