В математической части G
- это не матрица, а вектор. Точнее, это m
функции, [G1(theta), G2(theta), ..., Gm(theta)]
, которые даются в первой строке вашей математики. Аргумент theta
здесь также является вектором [theta1, ..., thetam]
. Вы хотите найти m
тэты, чтобы сделать вектор G
всеми нулями. Вот что написано прямо перед уравнением для J
.
Каждый из этих Gi
имеет производные по theta1
, ..., thetam
. Они записаны в матричной форме как J
в математике.
Чтобы решить эту нелинейную систему уравнений методом Ньютона, у вас есть предположение для некоторых значений для theta1
, ..., thetam
который называется theta^[k]
в математике. Оцените G
, чтобы получить вектор фактических чисел («остатки»). Это G(theta^[k])
в математике.
Если бы функция была линейной, вы могли бы выяснить, как точно исправить предположение, добавив вектор J(theta^[k]) \ -G(theta^[k])
. Это часть обновления Ньютона. Поскольку истинная функция является нелинейной, коррекция является лишь приближением. После вычисления theta^[k+1]
вы повторяете процесс, пока не будете удовлетворены качеством ответа.
(В общем случае метод Ньютона не обязательно сходится, но если вы находитесь в окрестности решение и / или вещи не слишком нелинейны, это довольно быстро, удваивая количество правильных цифр на каждой итерации.)
Редактировать: пример для m=5
m=5;
x=linspace(0, 3, m)';
theta=1/5*cos(x)+1/2*sin(x);
alpha=0;
beta=-0.2;
h=0.1;
steps=3;
format short e;
for k=1:steps+1
theta_minus1=[alpha; theta(1:end-1)];
theta_plus1=[theta(2:end); beta];
G=1/h^2*(theta_minus1-2*theta+theta_plus1) + sin(theta);
fprintf('G=');
disp(G');
if k == steps+1
break
end
J=1/h^2*(diag(-2+h^2*cos(theta)) + diag(ones(1, m-1), 1) + diag(ones(1, m-1), -1));
delta=J\-G;
theta=theta+delta;
end