Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач Юлин / учпосШевел-сборка25.doc
Скачиваний:
53
Добавлен:
10.12.2013
Размер:
626.69 Кб
Скачать

Алгоритм метода парабол дан в виде блок-схемы (рис. 6).

ВЫЧИСЛЕНИЕ

XM по (6)

X0= X1, X1= X2,

X2=XM,F0=F1

F1=F2;F2=FM

Рис. 6. Блок – схема алгоритма метода парабол.

Программа численного решения нелинейного уравнения (21) методом парабол (алгоритм представлен на языке программирования PASCAL)

Const n=5;

ax:array [1..n,1..n] of real=((10,1,2,3,4),(1,9,-1,2,-3),

(2,-1,7,3,-5),(3,2,3,12,-1),(4,-3,-5,-1,15));

{=((5,1,-2,0,-2,5),(1,6,-3,2,0,6),(-2,-3,8,-5,-6,0),

(0,2,-5,5,1,-2),(2,0,-6,1,6,-3),(5,6,0,-2,-3,8));}

Var mi,tt,k,j,i,w,ic0,ic1,ic2,icm,minc:integer;

zx,x,x0,x1,x2,xm,d0,d1,d2,dm,f0,f1,f2,eps:real;

H1,H2,B2,C2,G2,GS,BM:real;

mas:array [1..100] of real;

ax1:array [1..n,1..n] of real;

label ler;

{Процедура приведения числа к виду }

procedure rain(Var dd1:real;Var e1:integer);

Var fi:integer;

begin

while abs(dd1)>1 do

begin

dd1:=dd1/16;

e1:=e1+4;

end;

while abs(dd1)<=0.0625 do

begin

dd1:=dd1*16;

e1:=e1-4;

end;

end;

{Процедура приведения матрицы к треугольному виду}

procedure matrix(xxx:real);

Var ix,jx,kx:integer;

tx:array [1..n,1..n] of real;

detA:real;

begin

For kx:=1 to n do

For ix:=1 to n do

ax1[kx,ix]:=ax[kx,ix];

For kx:=1 to n do

For ix:=1 to n do

tx[kx,ix]:=0;

For kx:=1 to n do

ax1[kx,kx]:=ax1[kx,kx]-xxx;

For kx:=1 to n-1 do

begin

For ix:=kx+1 to n do

begin

tx[ix,kx]:=ax1[ix,kx]/ax1[kx,kx];

For jx:=kx+1 to n do

ax1[ix,jx]:=ax1[ix,jx]-tx[ix,kx]*ax1[kx,jx];

end;

end;

end;

{Процедура расчета значения функции в точке xx}

procedure func(Var xx:real;Var dd:real;Var e:integer);

Var kx,ix,i1,jj:integer;

begin

e:=0;

i1:=0;

dd:=0;

If mi=1 then

begin

dd:=(xx-1)*(xx+100)*(xx-0.0001)*(xx+4567)*(xx+15);

rain(dd,e);

end;

If mi=2 then

begin

dd:=1;

matrix(xx);

for jj:=1 to n do

begin

dd:=dd*ax1[jj,jj];

rain(dd,e);

end;

end;

If i<>1 then

begin

If mi=1 then

begin

i1:=i-1;

For jj:=1 to i1 do

begin

dd:=dd/(xx-mas[jj]);

rain(dd,e);

end;

end;

end;

end;

begin

mi:=2;

k:=5;

If mi=2 then k:=n;

eps:=0.0000001;

xm:=0;

For i:=1 to k do

begin

If mi=1 then

begin

x1:=-2;

x2:=1;

xm:=0.5;

end;

If mi=2 then

begin

x1:=xm-1;

x2:=xm+i-1;

xm:=xm+2*i;

end;

func(x1,d1,ic1);

func(x2,d2,ic2);

j:=0;

repeat

begin

inc(j);

func(xm,dm,minc);

x0:=x1;

x1:=x2;

x2:=xm;

ic0:=ic1;

ic1:=ic2;

ic2:=minc;

d0:=d1;

d1:=d2;

d2:=dm;

minc:=0;

H1:=x1-x0;

H2:=x2-x1;

B2:=H2/H1;

C2:=1+B2;

{Отыскание минимального показателя b значения функции}

If (ic0<=ic1)and(ic0<=ic2) then minc:=ic0;

If (ic1<=ic0)and(ic1<=ic2) then minc:=ic1;

If (ic2<=ic0)and(ic2<=ic1) then minc:=ic2;

{Приведение значений функций к одному показателю b=minc}

f0:=d0; f1:=d1; f2:=d2;

For tt:=1 to ic0-minc do

f0:=f0*2;

For tt:=1 to ic1-minc do

f1:=f1*2;

For tt:=1 to ic2-minc do

f2:=f2*2;

{Реализация метода}

G2:=f0*B2*B2-f1*C2*C2+f2*(B2+C2);

GS:=sqrt(abs(G2*G2-4*f2*C2*B2*(f0*B2-f1*C2+f2)));

If G2<=0 then w:=-1

else w:=1;

BM:=(-2*f2*C2)/(G2+w*GS);

xm:=x2+BM*H2;

If xm=0 then goto ler;

end;

{Условия выхода из цикла итераций}

until (abs((x2-xm)/xm)<eps)or(j>=50);

ler:

writeln('I=',i,' j=',j,' xm=',xm:3:8,' F=',f2:3:6,' *2^(',minc,')');

zx:=sqrt(abs(xm));

writeln(i,'-ja sobstvennaja chastota = ',zx:4:6);

mas[i]:=xm;

end;

readln;

end.

Список идентификаторов:

  • mi – параметр выбора объекта расчета (1- аналитически заданная функция, 2 – квадратная матрица);

  • k - количество отыскиваемых корней;

  • i – счетчик, номер текущего корня;

  • j – счетчик, число итераций при определении корня уравнения;

  • xm – текущее значение zi на каждой итерации;

  • x0,x1,x2 – начальные приближения;

  • f0,f1,f2 – значения функции в трех точках;

  • mas – массив корней уравнений;

  • ax – заданная матрица;

  • ax1 – вспомогательная матрица-‘двойник’;

  • eps – точность определения корней;

  • dd – аналитически заданная функция.

Пример 1. Методом парабол отыскать корни уравнения

F(x) = (x-2)(x-2)(x-3)(x-0,001)(x-0,1).

Решение уравнения получено с использованием программы, описанной выше, с указанием вида функции (идентификатор dd) и значения параметра im = 1.

Результат вычислений – значение корней и количество итераций (j), необходимое для нахождения каждого корня.

Пример 2. Определить собственные значения матрицы А [4]:

Результаты расчета собственных значений:

λ1=1,655266·100; λ2=6,994838·100; λ3=9,365555·100:

λ4=1,580892·101; λ5=1,917542·101.

При вычислении значений функции f(z) используется подпрограмма «rain», которая представляет число в форме b = a·2k, где а – мантисса числа, заключенная в интервале [0.0625, 1.0]; k – показатель степени, кратный четырем.

Для работы непосредственно с функцией (пример1) такая процедура является лишней. Но опыт использования алгоритма показывал, что в основном приходится иметь дело с матрицами высоких порядков. Примером можнт служить метод конечных элементов [5]. Значение определителя может достичь очень больших порядков, превосходящих возможности ЭВМ даже с учетом нестандартной длины представления переменных. Поэтому процедура «rain» становится необходимой.

При решении примера 2 была использована подпрограмма вычисления определителя методом Гаусса с учетом процедуры «rain» [6].

Соседние файлы в папке Курсач Юлин