我试图让 Matlab 将其作为x_1
throughx_n
和y_1
through的函数y_n
,其中k_i
和r_i
都是常量。
到目前为止,我的想法是从用户那里获取并制作两个称为and的n
1×n 向量,然后再拉出。但我不知道如何在 MATLAB 中任意求和。x
y
x_i
x(i)
我还需要得到这个函数的梯度,我也不知道怎么做。我在想也许我可以创建一个循环并将其添加到函数中,但 MATLAB 不喜欢这样。
我认为这个计算不需要循环。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
.
您可以通过以下方式象征性地求解梯度:
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]}))
x
是的,考虑到、y
、k
和r
已经定义,您确实可以使用循环来执行此操作。
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
您应该分析得出梯度,然后插入数字。扩展这些项然后找到结果多项式的导数应该不会太难。
矢量化解决方案类似于(我想知道你为什么使用 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
可以这样做