спасибо, что заглянули в мой вопрос. Я пытаюсь создать функцию, которая принимает в матрице, и через некоторое время возвращает минимальное значение конкретного расчета. Чтобы быть точным, мне нужно то, что называется измерительной матрицей. Эта измерительная матрица A будет выглядеть как [1 cos (t1) cos (t2); 0 грех (t1) грех (t2)]. Входными значениями являются t1 и t2 (тета 1 и тета 2 соответственно, и оба находятся в диапазоне от 0 до 2pi). Это для моего старшего математического проекта. Я начинаю с этого простого случая, а затем отсюда буду делать это для пространства R ^ 3 и R ^ 4.
Эта матрица, которую я использую, называется измерительной матрицей. Затем я беру эту матрицу измерений и рассчитываю ее когерентность, обозначаемую mu (или mu (A)). Поэтому мне нужно mu (A) = max (max (abs (A ’* A - eyes (3)))). Моя цель состоит в том, чтобы свести к минимуму согласованность моей измерительной матрицы A, а затем, получив этот минимум, получить возвращаемую вещь. Я пытаюсь сделать это с помощью конструкции типа поиска с градиентным спуском.
Далее я нахожу вектор градиента мю. Я делаю это, потому что градиент указывает в направлении наибольшего увеличения, так что я просто возьму его отрицательное значение, так что теперь у меня будет направление градиента, указывающее в сторону наибольшего уменьшения. Но чтобы найти градиент, мне нужны частичные, назовите их p1 и p2. Кроме того, мне также нужны два параметра, дельта и лямбда - у меня их просто есть в качестве входных значений (что-то вроде этого: 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
Возможно, вы задаетесь вопросом об этом лямбда-термине. В моих заметках о том, что я делаю, у меня есть две строки, которые говорят:
t1 = t1 - лямбда * p1
t2 = t2 - лямбда * p2
Но я не совсем уверен, где их поставить, но я знаю, что они важны и их нужно использовать.
Я предполагаю, что у меня может быть (вложенный) цикл Loop или два, чтобы у вас была исходная матрица, а затем для переменных значений тета он вычисляет когерентность 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
Мне бы хотелось, чтобы это выглядело как «минимизированная согласованность заключается в следующем, и именно для этих тэта-значений это работает», но вместо этого я просто получаю ошибки (хотя это не удивительно, я не уверен что делать здесь. Новое в программировании в целом).