【问题标题】:How to create multiple unknown variables in function handle for fminunc如何在 fminunc 的函数句柄中创建多个未知变量
【发布时间】:2013-11-27 04:38:06
【问题描述】:

只要 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 个未知变量键入代码中。

我怎样才能做到这一点?

【问题讨论】:

  • 我的回答对你有帮助吗?

标签: matlab


【解决方案1】:

嗯,有很多话要说。

首先,如果你最终得到的是数字,为什么还要使用符号呢? Matlab 可以进行符号计算,但它擅长数值计算,尤其是线性代数。其他次要的事情是:你给A的值没有被使用,因为A后来只是作为一个参数出现,range是用词不当,因为它实际上是A0的初始值fminunc要找到最小值,Eq 实际上是一个函数。

更重要的是,没有必要分别引用x(实际上是A)的元素——矩阵是Matlab中计算的自然单位。 p>

改变所有这些东西会得到:

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

在这种形式中,将代码扩展到更高维度是微不足道的:您只需适当设置参数bc 以及初始值A0。对于三个维度,例如:

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)

而对于510维,仅以随机初始化参数为例:

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;

这是一个简单的最小二乘问题,使用fminunc 是多余的。此外,在这种特殊情况下,找到的解决方案始终为函数值 0,如果A - c 为零,则可以实现这一点。所以整个最小化归结为:

A = c;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多