Текст подпрограммы и версий ( Фортран ) zf31r.zip zf31d.zip |
Тексты тестовых примеров ( Фортран ) tzf31r.zip tzf31d.zip |
Текст подпрограммы и версий ( Си ) zf31r_c.zip zf31d_c.zip |
Тексты тестовых примеров ( Си ) tzf31r_c.zip tzf31d_c.zip |
Текст подпрограммы и версий ( Паскаль ) zf31r_p.zip zf31e_p.zip |
Тексты тестовых примеров ( Паскаль ) tzf31r_p.zip tzf31e_p.zip |
Решение системы N нелинейных уравнений с N неизвестными методом Ньютона.
Пусть дана система N нелинейных уравнений с N неизвестными.
fi ( x1, x2, ..., xN ) = 0 , i = 1, 2, ..., N
Для решения заданной системы подпрограмма ZF31R на k - м шаге итерационного процесса Ньютона вычисляет решение следующей линейной системы методом Гаусса с выбором ведущего элемента по столбцу:
N ∑ αi j δx j( k ) = β i , j =1
где αi j = ∂fi /∂xj - якобиан системы, и βi = - fi, а затем вычисляет (k + 1) - е приближение к вектору решения на основе ранее найденного k - го приближения:
x ik+1 = x i(k) + δx i(k) , i = 1, 2, ..., N
Итерационный процесс по k повторяется до тех пор, пока не будет выполнен один из двух критериев сходимости:
N (1) ∑ | δx i(k) | ≤ EPSX i =1 N (2) ∑ | f i ( x1(k+1), x2(k+1), ..., xN(k+1)) | ≤ EPSF i =1
Если же ни одно из этих двух условий не выполнено за ITMAX итераций, то ZF31R прекращает свою работу и выдает диагностическое сообщение
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1979.
SUBROUTINE ZF31R (FUN, ROOT, N, EPSX, EPSF, ITMAX, ALPHA, BETA, NLEAD, IERR)
Параметры
FUN - |
имя подпрограммы вычисления
fi (x1, x2,
..., xN) и ∂fi /∂xj ǀ (x1, x2, ..., xN) , i=1,2,...,N, j=1,2,...,N; оформляется в виде подпрограммы с тремя формальными параметрами: |
X - | вещественный вектор длины N, содержащий текущее приближение к решению исходной системы; |
ALPHA - |
двумерный вещественный вектор размеров N на
N , в который помещаются значения элементов
Якобиана системы в точке X, т.е. ∂fi /∂xj ǀ (x1, x2, ..., xN) ; |
BETA - | вещественный вектор длины N, в который помещаются значения - f i ( x1, x2, ..., xN ) |
ROOT - | вещественный вектор длины N, содержащий вычисленное решение системы; перед началом работы подпрограммы вектор ROOT должен содержать начальное приближение к решению; |
N - | заданное число уравнений системы (тип: целый); |
EPSX - | первый критерий сходимости (1) (тип: вещественный); |
EPSF - | второй критерий сходимости (2) (тип: вещественный); |
ITMAX - | целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости в соответствии с заданными критериями; |
ALPHA - | двумерный вещественный массив размеров N на N, используемый в качестве рабочего; |
BETA - | вещественный вектор длины N, используемый в качестве рабочего; |
NLEAD - | целый вектор длины N, используемый в качестве рабочего; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженный в ходе работы подпрограммы; при этом: |
IERR=65 - | когда решение системы не может быть найдено в пределах заданного числа итераций; |
IERR=66 - | когда якобиан заданной системы имеет особенность |
Версии
ZF31D - | решение системы N нелинейных уравнений с N неизвестными методом Ньютона в режиме удвоенной точности; при этом параметры ROOT, EPSX, EPSF, ALPHA, BETA и формальные параметры подпрограммы FUN должны иметь тип DOUBLE PRECISION. |
Вызываемые подпрограммы
ASG9R - ASG9D | решение системы Ax = b или ATx = b методом Гаусса с выбором ведущего элемента по столбцу; используются в подпрограммах ZF31R и ZF31D соответственно. |
UTZF10 - UTZF11 | подпрограммы выдачи диагностических сообщений при работе подпрограмм ZF31R и ZF31D соответственно. |
Замечания по использованию
В подпрограммах ZF31R и ZF31D имеется общий блок COMMON /ZF31RR/ ITER. Переменная ITER полагается равной количеству итераций, выполненных при решении системы. |
SUBROUTINE FUN (X, ALPHA, BETA) DIMENSION X(3), ALPHA(3, 3), BETA(3) BETA(1) = - (X(1) + EXP(X(1) - 1) + (X(2) + X(3))**2 - 27) BETA(2) = - (X(1)*EXP(X(2) - 2) + X(3)**2 - 10) BETA(3) = - (X(3) + SIN(X(2) - 2) + X(2)**2 - 7) ALPHA(1, 1) = 1 + EXP(X(1) - 1) ALPHA(1, 2) = 2*(X(2) + X(3)) ALPHA(1, 3) = 2*(X(2) + X(3)) ALPHA(2, 1) = EXP(X(2) - 2) ALPHA(2, 2) = X(1)*EXP(X(2) - 2) ALPHA(2, 3) = 2*X(3) ALPHA(3, 1) = 0.0 ALPHA(3, 2) = COS(X(2) - 2) + 2*X(2) ALPHA(3, 3) = 1.0 RETURN END EXTERNAL FUN DIMENSION ROOT(3), ALPHA(3, 3), BETA(3), NLEAD(3) COMMON /ZF31RR/ ITER DATA ROOT /1.0, 1.0, 1.0/ N = 3 EPSX = 1.E-5 EPSF = 1.E-5 ITMAX = 30 CALL ZF31R (FUN, ROOT, N, EPSX, EPSF, ITMAX, ALPHA, * BETA, NLEAD, IERR) Результаты: ROOT = ( 1.0, 2.0, 3.0 ) ITER = 7 , IERR = 0