Текст подпрограммы и версий zf12c_p.zip |
Тексты тестовых примеров tzf12c_p.zip |
Вычисление нулей комплексной функции методом Мюллера.
ZF12C вычисляет нули комплексной функции Y = F (Z), используя метод Мюллера.
D.E.Muller, A Method for Solving Algebraic Equations Using an Automatic Computer, Math. Tab. Wash., 10, 1956.
procedure ZF12C(F :Func_F_Z; K :Integer; NG :Integer; N :Integer; EPS :Real; NDIG :Integer; var CROOT :Array of Complex; var ITER :Array of Integer; ITMAX :Integer; var IERR :Integer);
Параметры
F - | имя комплексной подпрограммы - функции вычисления F (Z); |
K - | число известных нулей функции, значения которых должны быть помещены перед началом работы подпрограммы в следующие компоненты вектоpа CROOT: CROOT (1), CROOT (2), ..., CROOT (K) (см. ниже) (тип: целый); |
NG - | число известных начальных приближений к искомым нулям функции, значения которых должны быть помещены перед началом работы подпрограммы в следующие компоненты вектоpа CROOT: CROOT (K + 1), CROOT (K + 2), ..., CROOT (K + NG) (см. ниже) (тип: целый); |
N - | заданное число искомых нулей функции (тип: целый); |
EPS - | первый критерий сходимости: заданная абсолютная погрешность вычисления нулей функции (тип: вещественный); |
NDIG - | второй критерий сходимости: заданное число значащих цифр, с которыми предполагается вычислять нули функции (тип: целый); |
CROOT - | комплексный вектоp длины K + N, содержащий вычисленные нули функции; компоненты этого вектоpа CROOT (1), CROOT (2), ..., CROOT (K) содержат значения нулей функции, известных до начала работы подпрограммы, а компоненты CROOT (K + 1), CROOT (K + 2), ..., CROOT (K + N) по окончании работы подпрограммы содержат искомые нули, при этом компоненты CROOT (K + 1), CROOT (K + 2), ..., CROOT (K + NG) перед началом работы подпрограммы могут содержать начальные приближения к искомым нулям; |
ITER - | целый вектоp длины K + N, j - я компонента которого содержит число итераций, потребовавшихся для нахождения j - го нуля функции в соответствии с заданными критериями сходимости; |
ITMAX - | целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости; |
IERR - | целая переменная, значение которой в результате работы подпрограммы полагается равным 1, если хотя бы один нуль функции не может быть посчитан в пределах заданного числа итераций. |
Версии: нет
Вызываемые подпрограммы
UTZF10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF12C. |
Замечания по использованию
Если ни один из нулей функции перед началом работы подпрограммы не известен, то значение K полагается равным 0. Точно так же, значение NG должно быть положено pавным 0, если не известно ни одно из приближений к искомым нулям функции. При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда NDIG задается равным 0), либо оба критерия одновременно. Если Zi - 1 и Zi являются двумя последовательными приближениями к j - му нулю функции, то Zi принимается за искомый нуль, если выполнен один из двух критериев сходимости | F(Zi) | ≤ | EPS | или | Zi-1 - Zi | < | Zi | * 10 (- NDIG ) . Если при вычислении j - го нуля функции заданные критерии сходимости не выполняются, то ITER (J) полагается равным либо ITMAX + 1, либо ITMAX + L, где L > 1. В случае, когда ITER (J) = ITMAX + 1, то это означает, что ZF12C не в состоянии удовлетворить заданным критериям сходимости в пределах ITMAX итераций (рекомендуется увеличить значение ITMAX). Если ITER (J) = ITMAX + L, то это означает, что сходимость была достигнута за L итераций для функции FP(Z) = F(Z) / ( (Z - ROOT(1)) ... (Z - ROOT(J-1)) ) ,но не была достигнута для функции F (Z). B этом случае можно попытаться задать более лучшие начальные приближения либо смягчить критерии сходимости. |
Unit TZF12C_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FZF12C_p, ZF12C_p; function TZF12C: String; implementation function TZF12C: String; var NDIG,K,NG,N,ITMAX,_i,I,IERR :Integer; EPS :Real; CRООТ :Array [0..4] of Complex; ITER :Array [0..4] of Integer; begin Result := ''; { результат функции } EPS := 0.0; NDIG := 5; K := 0; NG := 0; N := 5; IТМАХ := 200; ZF12C(FZF12C,K,NG,N,EPS,NDIG,CROOT,ITER,ITMAX,IERR); Result := Result + Format(' %10d %10d %10d %16.7f %10d %10d %10d ',[K,NG,N,EPS,NDIG,ITMAX,IERR]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%16.7f %16.7f ',[CROOT[_i].re,CROOT[_i].im]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%10d ',[ITMAX]) + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 5 do begin Result := Result + Format('%10d ',[ITER[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TZF12C',Result); { вывод результатов в файл TZF12C.res } exit; end; end. Unit fzf12c_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; function fzf12c(Z :Complex): Complex; implementation function fzf12c(Z :Complex): Complex; var ONE :Complex; begin { Result - прототип имени функции F на FORTRANe } ONE := Cmplx(1.0,0.0); Result := SubC(Cpower(Z,5),ONE); exit; end; end. Результаты: CROOT(1) = (- 0.809017, 0.587785) , CROOT(2) = ( 0.309017, - 0.951056) , CROOT(3) = ( 0.309017, 0.951056) , CROOT(4) = (- 0.809017, - 0.587785) , CROOT(5) = ( 1.0, 0.0) ITER = (26, 10, 10, 4, 4)