Home > Кодинг, Проги, С++, Численные методы > ЧМ: Решение СЛАУ с трехдиагональной матрицей методом прогонки

ЧМ: Решение СЛАУ с трехдиагональной матрицей методом прогонки

О том, xто такое метод прогонки, можно прочитать здесь.

С реализацией я особо не заморачивался, поэтому консольный режим. Написана в среде MS Visual Studio 2005.

Зависимости:

  • stdafx.h
  • conio.h
  • iostream.h
  • iomanip.h

Программный код.


//Всякие директивы
#include "stdafx.h"
#include "conio.h"

//Директивы для работы с потоками ввода-вывода

#include <iostream>
#include <iomanip>

//Используем cout, cin и endl из пространства имен std
using std::cout;
using std::cin;
using std::endl;
//Самая-самая главная процедура 8-)
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"Kolichestvo peremennih >>> ";
int n;

//Вводим в переменную данные с потока
cin>>n;

//Выделение памяти под основной массив
float *base = (float*)calloc(n*(n+1), sizeof(float));

//Эти два вложенных цикла используются для ввода элементов массива
for (int i=0; i<n; i++)
{

for (int j=0; j<n; j++)
{
cout<<"Vvedite element "<<j+1<<" stroki "<<i+1<<" >>> ";
cin>>*(base+i*(n+1)+j);
}
cout<<"Vvedite otvet k stroke "<<i+1<<" >>> ";
cin>>*(base+i*(n+1)+n);
}

//Следующие строчки мне нужны были для контроля индексации
cout<<endl<<endl;
for (int i=0; i<n*n+n; i++)
cout<<"*(base+"<<i<<")="<<*(base+i)<<endl;


//Выделение массивов для вспомогательных коэффициентов
float *alpha; float *betta;
alpha = (float*)calloc(n, sizeof(float));
betta = (float*)calloc(n, sizeof(float));

//Расчет и вывод первых коэффициентов
*alpha = - *(base+1) / *base;
*betta = *(base+n) / *base;
cout<<endl<<"alpha 1 = "<<*alpha<<endl;
cout<<"betta 1 = "<<*betta<<endl;

//В этом АЦЦКОМ цикле производится расчет всех остальных коэффициентов. Также имеется вывод. Он сдесь опять же для отлова ошибок...ну и для красоты :-)
for (int i=1; i<n; i++)
{
*(alpha+i) = -*(base+i*(n+1)+i+1)/(*(base+i*(n+1)+i-1)**(alpha+i-1)+*(base+i*(n+1)+i));

cout<<"alpha"<<i<<" = -"<<*(base+i*(n+1)+i+1)<<"/("<<-*(base+i*(n+1)+i+1)<<"*"<<*(alpha+i-1)<<"+"<<*(base+i*(n+1)+i)<<")="<<*(alpha+i)<<endl;

*(betta+i) = (*(base+i*(n+1)+n) - *(base+i*(n+1)+i-1)**(betta+i-1))/
(*(base+i*(n+1)+i-1)**(alpha+i-1)+*(base+i*(n+1)+i));

cout<<"betta"<<i<<" = ("<<*(base+i*(n+1)+n)<<"-"<<*(base+i*(n+1)+i-1)<<"*"<<*(betta+i-1);
cout<<")/("<<*(base+i*(n+1)+i-1)<<"*"<<*(alpha+i-1)<<"+"<<*(base+i*(n+1)+i)<<")="<<*(betta+i)<<endl;
}


//Выделение память под массив ответов
float *ans = (float*)calloc(n, sizeof(float));


//Вычисление первого последнего корня уравнения (Xn)
*(ans+n) = (*(base+n*(n+1))-*(base+n*(n+1)-2)**(betta+n))/
(*(base+n*(n+1)-2)**(alpha+n)+*(base+n*(n+1)-1));


//В этом цикле определяются предыдущие корни уравнения (X(n-1)..X1)
for (int i=n-1; i>=0; i--)
*(ans+i)=*(alpha+i)**(ans+i+1)+*(betta+i);


//А здесь эти корни выводятся на экран
for(int i=0; i<n; i++)
cout<<"Koren' "<<i+1<<" = "<<*(ans+i)<<endl;

getch();
//Задержка экрана
return 0;
//Конец :-)
}
Как и всегда, все очень просто и понятно.

Advertisements
  1. 23.09.2009 at 18:47

    Содержание сайта хорошо продуманное, много полезного для себя прочитал.

  2. 04.11.2013 at 22:16

    Один вопрос, после гетча выдает неизвестную ошибку ссылающуюся на ячейку памяти… В чем может быть трабл? Я просто грамматику C++ перевел в обычный C, может ли это быть причиной?

  3. 07.11.2013 at 16:12

    А что именно выдает?

  4. 11.11.2013 at 22:34

    Теперь другой трабл, программа не ругается на адский цикл, в том плане, что в расчетах получается деление на ноль(

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: