- •Содержание
- •3.1. Аппроксимация данных методом наименьших квадратов 11
- •1. Решение систем линейных алгебраических уравнений
- •1.1. Классический метод Гаусса
- •1.2. Метод Гаусса с выбором главного элемента
- •2. Метод Ньютона для снау
- •2.1. Вариант 1
- •2.2. Вариант 2
- •I, n : IntType;
- •X,y,x0,y0 : RealType;
- •3. Аппроксимация данных методом наименьших квадратов
- •3.1. Аппроксимация данных методом наименьших квадратов
- •3.2. Аппроксимация данных с другими нормами
- •3.3. Аппроксимация данных многочленом заданной степени
- •Var X,y:array[1..Nmax] of real;
- •I,n:integer;
- •4. Решение систем дифференциальных уравнений
- •4.1. Метод Эйлера
- •4.2. Методы Рунге-Кутта
- •Проверка выполнения программы
- •X, h: RealType;
- •I, j : IntType;
- •X : RealType;
- •I, j, k : IntType;
I, n : IntType;
X,y,x0,y0 : RealType;
F,F1,dx : ArrayType;
Yacobi : MatrixType;
Flag : BoolType;
ff : Text;
Function FunF(x,y: Real): RealType;
{Вычисление значения функции F(x,y)}
Begin
FunF:= A*x*x + B*y*y - 1;
End;
Function FunG(x,y: Real): RealType;
{Вычисление значения функции G(x,y)}
Begin
FunG:= Sin(C*x + D*y) - E*x;
End;
Function DivFx(x,y: Real): RealType;
{Вычисление значения производной функции dF(x,y)/dx}
Begin
DivFx:= 2*A*x;
End;
Function DivFy(x,y: Real): RealType;
{Вычисление значения производной функции dF(x,y)/dy}
Begin
DivFy:= 2*B*y;
End;
Function DivGx(x,y: Real): RealType;
{Вычисление значения производной функции dG(x,y)/dx}
Begin
DivGx:= C*Cos(C*x+D*y) - E;
End;
Function DivGy(x,y: Real): RealType;
{Вычисление значения производной функции dG(x,y)/dy}
Begin
DivGy:= D*Cos(C*x+D*y);
End;
{ГОЛОВНАЯ ПРОГРАММА}
BEGIN
ClrScr; {Очистка экрана}
Assign(ff, NameOut);
ReWrite(ff);
Write ('Введите начальное приближение к корню x:');
ReadLn(x0);
WriteLn(ff, 'Начальное приближение x= ',x0);
WriteLn(ff,' ');
WriteLn;
Write ('Введите начальное приближение к корню y:');
ReadLn(y0);
WriteLn(ff, 'Начальное приближение y= ',y0);
WriteLn(ff,' ');
WriteLn;
x:= x0; y:= y0;
n:=0; {Начальное число итераций}
Repeat
Flag:=true; {Флажок= Истина}
{Вычисление функции}
F[1]:= FunF(x,y);
F[2]:= FunG(x,y);
{Вычисление Якобиана}
Yacobi[1,1]:= DivFx(x,y);
Yacobi[1,2]:= DivFy(x,y);
Yacobi[2,1]:= DivGx(x,y);
Yacobi[2,2]:= DivGy(x,y);
WriteLn(ff, 'x=',x:15:7,' y=',y:15:7,
' f(x,y)=', F[1]:15:7,' g(x,y)=', F[2]:15:7);
WriteLn('x=',x:15:7,' y=',y:15:7,
' f(x,y)=', F[1]:15:7,' g(x,y)=', F[2]:15:7);
{Вычисление корней (приращений) по методу Крамера: через определитель}
dx[1]:= (-F[1]*Yacobi[2,2]+F[2]*Yacobi[1,2])
/(Yacobi[1,1]*Yacobi[2,2]-Yacobi[2,1]*Yacobi[1,2]);
dx[2]:= (-Yacobi[1,1]*F[2]+F[1]*Yacobi[2,1])
/(Yacobi[1,1]*Yacobi[2,2]-Yacobi[2,1]*Yacobi[1,2]);
x:= x+dx[1];
y:= y+dx[2];
{Новые значения функции}
F1[1]:= FunF(x,y);
F1[2]:= FunG(x,y);
{Вычисление погрешности}
For i:=1 to 2 do
if(Abs(F1[i]-F[i]) > Eps) Then Flag:= False;
{Если погрешность велика, то Флажок = Ложь}
n:=n+1; {Определение количества итераций}
Until Flag or (n > 100);
WriteLn(ff,'Расчет oкончен');
WriteLn(ff,' ');
WriteLn('Расчет oкончен');
WriteLn;
WriteLn(ff, 'Количество итераций, n=',n:10);
WriteLn('Количество итераций, n=',n:10);
Close(ff);
WriteLn (' ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ!!!');
Repeat Until KeyPressed; {Ожидает нажатия любой клавиши, модуль Crt}
{Используется для задержки информации на экране}
ClrScr;{Очищает экран, модуль Crt}
END.