Http://lord-n.Narod.Ru/download/books/walla/programming/Spr_po_C/06/0604.Htm
Содержание
1. Введение ………………………………………………………….2
2. Метод ортогонализации ………………………………………...3
3. Заключение ……………………………………………………….9
4. Список литературы ……………………………………………..10
Введение
К решению систем линейных алгебраических уравнений приводятся многие задачи численного анализа.
Известное из курса высшей алгебры правило Крамера для решения систем линейных алгебраических уравнений практически невыгодно, так как требует слишком большого количества арифметических операций и записей. Поэтому было предложено много различных способов, более пригодных для практики.
Используемые практически методы решения систем линейных алгебраических уравнений можно разделить на две большие группы: так называемые точные методы и методы последовательных приближений. Точные методы характеризуются тем, что с их помощью принципиально возможно, проделав конечное число операций, получить точные значения неизвестных. При этом, конечно, предполагается, что коэффициенты и правые части системы известны точно, а все вычисления производятся без округлений. Чаще всего они осуществляются в два этапа. На первом этапе преобразуют систему к тому или иному простому виду. На втором этапе решают упрощенную систему и получают значения неизвестных.
Методы последовательных приближений характеризуются тем, что с самого начала задаются какими-то приближенными значениями неизвестных. Из этих приближенных значений тем или иным способом получают новые «улучшенные» приближенные значения. С новыми приближенными значениями поступают точно также и т.д. При выполнении определенных условий можно придти, вообще говоря, после бесконечного числа шагов. Рассмотрим метод ортогонализации .
Метод ортогонализации
Пусть дана система
Решение:
Представим матрицу А данной системы в виде произведения матрицы R с ортогональными столбцами на определитель матрицы с единичной диагональю.
A=RT=
Полагаем:
= =
Имеем:
(1)
По формуле (1) находим:
Где
И
Контроль
Контроль:
.
Таким образом,
где - диагональная матрица и b=
По формуле (2) имеем
Для матрицы и её обратной матрицы получаем такие значения:
Далее,
Наконец, обычным приёмом подставляем:
В итоге получим :
Следовательно ,
Точные значения корней
Http://valera.asf.ru/cpp/scpp/cppd_baseoperators.htm
Http://citforum.ru/programming/cpp_ref/ref_8.shtml
Http://cpp.com.ru/shildt_spr_po_c/06/0604.html
http://natalia.appmat.ru/c&c++/lezione5.php#l5_valore_ind
Http://www.cyberforum.ru/cpp-beginners/thread192873.html
Http://citforum.ru/programming/cpp_march/cpp_017.shtml
http://www.cyberguru.ru/cpp/
http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/06/0604.htm
Метод ортогонализации в программе С++
//---------------------------------------------------------------------------
//#include <vcl\condefs.h>
#include <math.h>
#include <stdio.h> заголовочный файл для организации функций ввода-
#include <stdlib.h> вывода.
#include <string.h>
//#pragma hdrstop
//---------------------------------------------------------------------------
//USERES("Pr_Ort_1.res");
//---------------------------------------------------------------------------
/*
float Scl(int N,float A[],float B[]) (
{
int i,j;
float S=0; //- заголовочный файл стандартной библиотеки языка программирования С, который содержит макрос, определяющий различные ограничения и параметры типов с плавающей точкой.
for(i=0;i<N;i++)S+=A[i]*B[i];
return S;
}
*/
int main(int argc, char **argv) // задаёт массив ? передает управление операционной системе
{
int i,j,k,N=3;
float S=0,rab,res,
T[9][9], Tob[9][9], D[9][9],Dob[9][9],Dt[9][9], R[9][9], Rtr[9][9], Rb[9], AT[4][4],X[9],
/*
A[4][4]={
{ 1 , 2 , 3 , 4 },
{ 4 , 3 , 2 , 1 },
{ 1 , 3 , 2 , 4 },
{ 2 , 4 , 1 , 3 }
},
B[9]={30,20,29,25},
*/
A[3][3]={
{0.4, 0.3,-0.2},
{0.6,-0.5, 0.3},
{0.3, 0.2, 0.5}
},
B[9]={2,2.5,11}
;
//
// **************************
//
// {r11 r12 r13} {1 t12 t13}
// A = R*T = {r21 r22 r23} {0 1 t23}
// {r31 r32 r33} {0 0 1}
//
// **************************
//
for(i=0;i<N;i++) for(j=0;j<N;j++) T[i][j]=R[i][j]=0; - оператор, вводящий имя в программе
for(i=0;i<N;i++)
{
Printf ("\nA");
for(j=0;j<N;j++)printf("%5.2f",A[i][j]);
}
printf("\n");
//
//*************************************
/*
for(i=1;i<N;i++)
for(j=0;j<i;j++)
{
S=A[j][i]; A[j][i]=A[i][j];A[i][j]=S; // The Inverse Matrix -// обратная матрица
printf("\n%5.4f",A[i][j]);
}
for(i=0;i<N;i++)
{
printf("\n");
for(j=0;j<N;j++)printf("%5.0f",A[i][j]);
}
getchar();
*/
//********************************
//
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
S=0;if (i==j) S=1.0;
T[i][j]=S;
}
for(i=0;i<N;i++)
{
if (i==0)for(j=0;j<N;j++) {R[j][0]=A[j][0]; printf(" R %5.2f",R[j][0]);}
getchar();
if (i>0)
{
for(j=0;j<N;j++)
{
for(k=0;k<i;k++)
{
R[j][i]-=T[k][i]*R[j][k];
printf("\n I %3d K %3d R[j][i] %7.4f T[k][i] %7.4f R[j][k] %7.4f",
i,k,R[j][i],T[k][i],R[j][k]);
}
}
printf("\n\n");
for(j=0;j<N;j++)
{
printf("\n R %5.2f",R[j][i]);
R[j][i]+=A[j][i]; //R[j][i]=A[j][i]+R[j][i];
printf("A[j][i] %7.4f R %7.4f",A[j][i],R[j][i]);}
}
//********************************
for(k=0;k<N;k++)
{
printf("\n\n");
for(j=0;j<N;j++)printf(" %7.4f",R[k][j]);
}
getchar();
//***********************
rab=0;
for(k=0;k<N;k++) rab+=R[k][i]*R[k][i];
printf("\n rab %7.4f",rab);
for(j=i+1;j<N;j++)
{
S=0;
for(k=0;k<N;k++) S+=R[k][i]*A[k][j];
printf(" S %5.2f",S);
T[i][j]=S/rab;
}
}
printf("\n\n********** End building R **********\n");
for(k=0;k<N;k++)
{
printf("\n\n");
for(j=0;j<N;j++)printf(" %7.4f",R[k][j]);
}
printf("\n\n********** End building T **********\n");
for(i=0;i<N;i++)
{
printf("\n\n ");
for(j=0;j<N;j++)printf(" %7.4f",T[i][j]);
}
printf("\n\n********** End building R and T **********");
printf("\n\n Now You have to go to building x=T-1D-1R'B \n");
for(i=0;i<N;i++)
for(j=0;j<N;j++) Tob[i][j]=T[i][j];// 1 step
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++) Tob[i][j]=-Tob[i][j];// 2 step
for(i=0;i<N;i++)
{
printf("\n\n Tob ");
for(j=0;j<N;j++)printf(" %7.4f",Tob[i][j]);// 3 step
}
printf("\n\n********** End building R and T **********");
printf("\n\n Now You have to go to building ------------x=D-1 R'B \n");
for(j=0;j<N;j++)for(k=0;k<N;k++) Rtr[j][k]=R[j][k];
for(j=0;j<N;j++)
//printf("\n\n R ========= ");
for(k=0;k<N;k++)
for(k=0;k<N;k++)for(j=0;j<k;j++)
{
//printf("\n k %2d j %2d",k,j);
rab=Rtr[k][j];
//printf("\n i %7.4f",rab);
Rtr[k][j]=Rtr[j][k];
//printf(" rjk %7.4f",Rtr[j][k]);
Rtr[j][k]=rab;
}
for(j=0;j<N;j++)
{
printf("\n\n Rtr ");
for(k=0;k<N;k++) printf(" %7.4f",Rtr[j][k]);
}
for(j=0;j<N;j++)
{
S=0;
for(k=0;k<N;k++) S+=Rtr[j][k]*B[k];
Rb[k]=S;
printf(" \n R'*b %7.4f",S);
}
printf("\n\n Now You have to go to building x=D-1 \n"); // функция,выводящая на экран значение своего первого параметра (то, что в ковычках)for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
S=0;
for(k=0;k<N;k++)S+=Rtr[i][k]*R[k][j];
D[i][j]=S;
}
for(i=0;i<N;i++)
{
printf("\n\n D ");
for(j=0;j<N;j++) printf(" %7.4f",D[i][j])
}
for(i=0;i<N;i++)
for(j=0;j<N;j++) Dob[i][j]=D[i][j];// 1 step
for(i=0;i<N;i++)
for(j=i;j<N;j++) Dob[i][j]=-Dob[i][j];// 2 step
for(i=0;i<N;i++)
{
printf("\n\n Dob ");
for(j=0;j<N;j++)printf(" %7.4f",Dob[i][j]);// 3 step
}
printf("\n\n Now You have to go to building x \n");
for(i=0;i<N;i++)
{
printf("\n\n Tob ");
for(k=0;k<N;k++) printf(" %7.4f",Tob[i][k]);
}
for(j=0;j<N;j++)
{
S=0;
for(k=0;k<N;k++) S+=Tob[i][k]*Dob[k][j];
Dt[i][j]=S;
printf(" \n Dt %7.4f",S);
}
for(i=0;i<N;i++)
{
printf("\n ");
for(j=0;j<N;j++)
{
S=0;
{
S+=Tob[i][j]*Dob[i][j];
}
Dt[i][j]=S;
printf("\n Dt %7.4f", S);
}
}
printf("\n ************* The End ***********\n ");
return 0; -. завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию, в точку, непосредственно следующую за вызовом.}
: - служит для описания идентификатора как метки
; - Пустой оператор используется для помещения метки непосредственно перед } составного оператора или того, чтобы снабдить такие операторы, как while, пустым телом.
//---------------------------------------------------------------------------
Заключение
В данной работе были рассмотрены метод ортогонализации , а также представлена программа на языке программирования С++, реализующая метод ортогонализации на ЭВМ, и ее результаты работы.
Список литературы
1. Березин И.С. и Жидков Н.П. Методы вычислений. т. 1. М.: «Наука», 1965. 633c.
2. Воеводин В.В. Численные методы алгебры (теория и алгоритмы). М.: «Наука», 1966.
3. Подбельский В.В. и Фомин С.С. Программирование на языке Си. М.: «Финансы и статистика», 2000. 599 с.
4. Калиткин Н.Н. Численные методы. М.: «Наука», 1978. 512 с.