感谢您调查我的问题。我正在尝试创建一个接受矩阵的函数,然后一点点返回特定计算的最小值。确切地说,我需要一个称为测量矩阵的东西。该测量矩阵A看起来像[1 cos(t1)cos(t2); 0 sin(t1)sin(t2)]。输入值为t1和t2(分别为theta 1和theta 2,都在0到2pi之间)。这是给我的高级数学顶点项目。我从这个简单的案例开始,然后从这里开始针对R ^ 3和R ^ 4空间。
我使用的这个矩阵称为测量矩阵。然后,我使用此测量矩阵并计算其相干性,用mu(或mu(A))表示。所以我需要mu(A)= max(max(abs(A’* A-eyes(3))))。我的目标是最小化我的测量矩阵A的相干性,然后在达到最小值后,将其返回。我正在尝试通过梯度下降搜索类型构造来做到这一点。
接下来,我正在找到mu的梯度向量。之所以这样做,是因为渐变指向最大增加的方向,所以我只取负值,所以现在我将指向最大减少的渐变方向。但是要找到渐变,我需要局部变量,将它们称为p1和p2。此外,我还需要两个参数delta和lambda -我只是将它们作为输入值(类似这样:lambda = input('输入lambda的值:'))。
现在,梯度向量gradmu将看起来像[p1,p2],每个部分看起来像 p1 =((mu(A(t1 + delta,t2)))-(mu(A(t1,t2))))/ delta p2 =((mu(A(t1,t2 + delta)))-(mu(A(t1,t2))))/ delta
您可能想知道那个lambda词。在我所做的笔记中,我有两行是
t1 = t1-lambda * p1
t2 = t2-lambda * p2
但是我不确定要放在哪里,但是我知道它们很重要并且需要使用。
我想我可能会有一个(嵌套的)Loop或两个,这样您就有了初始矩阵,然后针对变化的theta值,它计算A的相干性,然后吐出所有相干性计算的最小值(这可能需要跟踪所有结果/迭代并采取最小的结果/迭代),然后计算局部值,然后吐出渐变的负数。我正在尝试创建的函数就是上述所有功能,但是尽管正在尝试,但我不知道如何编写代码。这是我到目前为止的内容:
% Parameters
n = 2; % Dimension of space. Specifically we are in R^2
delta = input('Enter small numeric value for delta: '); % The delta
used in calculating partial derivatives
lambda = input('Enter small numveric value for lambda: '); % Step
size (learning rate)
max_iter = 10000; % maximum number of iterations
func_tol = 0.000001 % termination tolerance for what I believe
will be mu (basing this off of the gradient search algo on the Wiki
page)
fvals = []; % stores mu values across iterations
A = @(t1, t2) [1 cos(t1) cos(t2); 0 sin(t1) sin(t2)]:
mu = @A max(max(abs(A'*A - eyes(3))));
p1 = ((mu((A(t1+delta, t2))))-(mu(A(t1, t2))))/delta;
p2 = ((mu((A(t1, t2+delta))))-(mu(A(t1, t2))))/delta;
% Iterate
iter = 1; % iterations counter
fvals(iter) = mu;
while iter < max_iter && fvals(end) > func_tol
iter = iter + 1;
t1 = t1 - lambda * p1; % gradient descent
t2 = t2 - lambda * p2 % gradient descent
A = @(t1, t2) [1 cos(t1) cos(t2); 0 sin(t1) sin(t2)]:
mu = @A max(max(abs(A'*A - eyes(3))));
disp(min(mu))
end
我希望它像“最小的相干性是这样,并且正是这些theta值才能使之起作用”,但我只是遇到错误(尽管这些并不奇怪,我不确定在这里做什么。通常是编程新手。)