只要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个未知变量
我怎样才能做到这一点?
答案 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