2

我试图让 Matlab 将其作为x_1throughx_ny_1through的函数y_n,其中k_ir_i都是常量。

$$ \sum_{i=2}^{n} ( k_{i-1}*( \sqrt ( (x_i - x_{i-1})^2 + (y_{i}-y_{i-1} )^2 ) -r_{i-1})^2$$

到目前为止,我的想法是从用户那里获取并制作两个称为and的n1×n 向量,然后再拉出。但我不知道如何在 MATLAB 中任意求和。xyx_ix(i)

我还需要得到这个函数的梯度,我也不知道怎么做。我在想也许我可以创建一个循环并将其添加到函数中,但 MATLAB 不喜欢这样。

4

4 回答 4

3

我认为这个计算不需要循环。MATLAB 擅长矢量化操作,那么这样的东西对你有用吗?

l = 10; % how large these vectors are
k = rand(l,1); % random junk values to work with
r = rand(l,1);
x = rand(l,1);
y = rand(l,1);
vals = k(1:end-1) .* (sqrt(diff(x).^2 + diff(y).^2) - r(1:end-1)).^2;
sum(vals)

编辑:感谢@Amro 更正公式并用diff.

于 2013-05-29T18:35:39.333 回答
1

您可以通过以下方式象征性地求解梯度:

n = 10;
k = sym('k',[1 n]); % Create n variables k1, k2, ..., kn
x = sym('x',[1 n]); % Create n variables x1, x2, ..., xn
y = sym('y',[1 n]); % Create n variables y1, y2, ..., yn
r = sym('r',[1 n]); % Create n variables r1, r2, ..., rn
% Symbolically sum equation
s = sum((k(1:end-1).*sqrt((x(2:end)-x(1:end-1)).^2+(y(2:end)-y(1:end-1)).^2)-r(1:end-1)).^2)
grad_x = gradient(s,x) % Gradient with respect to x vector
grad_y = gradient(s,y) % Gradient with respect to y vector

符号和和梯度可以通过以下方式计算并转换为浮点数:

% n random data values for k, x, y, and r
K = rand(1,n);
X = rand(1,n);
Y = rand(1,n);
R = rand(1,n);
% Substitute in data for symbolic variables
S = double(subs(s,{[k,x,y,r]},{[K,X,Y,R]}))
GRAD_X = double(subs(grad_x,{[k,x,y,r]},{[K,X,Y,R]}))
GRAD_Y = double(subs(grad_y,{[k,x,y,r]},{[K,X,Y,R]}))

gradient函数是符号变量(类型help sym/gradient)的重载函数,或者参见更详细的在线文档)。

于 2013-05-29T21:33:30.927 回答
0

x是的,考虑到、ykr已经定义,您确实可以使用循环来执行此操作。

n = length(x);
s = 0;
for j = 2 : n
    s = s + k(j-1) * (sqrt((x(j) - x(j-1)).^2 + (y(j) - y(j-1)).^2) - r(j-1)).^2
end

您应该分析得出梯度,然后插入数字。扩展这些项然后找到结果多项式的导数应该不会太难。

于 2013-05-29T18:32:55.300 回答
0

矢量化解决方案类似于(我想知道你为什么使用 sqrt().^2):

is = 2:n;
result = sum( k(is - 1) .* abs((x(is) - x(is-1)).^2 + (y(is) - y(is-1)).^2 - r(is-1)));

您可以象征性地计算梯度,也可以将此代码重写为函数并进行标准的 +-eps 计算。如果您需要梯度来运行优化(您的代码看起来像一个适应度函数),您可以使用自己计算它们的算法,例如,fminsearch可以这样做

于 2013-05-29T18:42:32.853 回答