Обробка масиву та використання простої ітерації
Завдання
Завдання. Скласти на одній з алгоритмічних мов програму, що запускається і видає на екран меню з двох пунктів (рішення системи, вихід).
На вибір першої опції меню ввести з чи клавіатури згенерувати за допомогою вбудованого в мову генератора псевдовипадкових чисел (запросити спосіб) матрицю коефіцієнтів при невідомих і масив вільних членів системи n рівнянь з n невідомими і, при виконанні необхідних умов одержати рішення системи за допомогою методу ітерацій з точністю 0.000001. Прийняти, що 2 n 10. Значення n=6 ввести з клавіатури по запиту програми. Здійснити перевірку отриманого рішення.
На вибір другої опції чи меню натисканні користувачем на клавішу ESC здійснити вихід із програми.
Зміст
1.Вступ.....................................................................................................................................3
2.Задача і теорія ітерації.................................................................................4
3.Текст програми.......................................................................................................5
4.Приклад............................................................................................................................11
5.Висновок......................................................................................................................... 12
6.Література......................................................................................................................13
Вступ
Для закріплення здобутих теоретичних знань, застосування їх при вирішенні питань математичного характеру, а також з метою набуття навиків по створенню програмного забезпечення , виконується курсова робота з дисципліни “Програмування та алгоритмічні мови” . В курсовій роботі необхідно розробити програму на мові програмування C++,яка знаходила корені системи рівняннь за допомогою методу простої ітерації .Важливо також щоб програма була універсальною, тобто працювала при різних даних.
Задача і теорія ітерації
Завдання. Скласти на одній з алгоритмічних мов програму, що запускається і видає на екран меню з двох пунктів (рішення системи, вихід).
На вибір першої опції меню ввести з чи клавіатури згенерувати за допомогою вбудованого в мову генератора псевдовипадкових чисел (запросити спосіб) матрицю коефіцієнтів при невідомих і масив вільних членів системи n рівнянь з n невідомими і, при виконанні необхідних умов одержати рішення системи за допомогою методу ітерацій з точністю 0.000001. Прийняти, що 2 n 10. Значення n=6 ввести з клавіатури по запиту програми. Здійснити перевірку отриманого рішення.
Ітераційні методи мають в основі своїй повторювальні процеси уточнення коренів заданої точності.У більшості випадків самі реалізації методів є не складними, однак для досягнення заданої точності вимагається досить велика кількість повторів.
Нехай задана СЛАР
Одним із методів ітерації є метод Якобі . Розпишемо :
А=Ав+Ан+d, де
Ан= d=Ав=
Ітераційний процес виду
при домножуючій матриці С=d відповідає методу простої ітерації . Цей метод називається ще методом Якобі у компонентній формі система (10) матиме вигляд :
Систему (11) зручно використовувати при чисельній реалізації методу на ЕОМ.(в нашому випадку)
Встановимо умови збіжності ітераційного процесу (10),(12) . Для цього визначимо норму відображаючого оператора . В якості норми виберемо (суму норми елементів матриці ) , тоді
Тепер дана умова (13) визначає критерій для збіжності ітераційного процесу і передбачає обв’язковість діагональної переввваги матриці А . Таким чином перед використанням ітераційних співвідношень методу Якобі необхідно спочатку перевірити матрицю А на діагональну перевагу . Якщо (13) виконується, то в якості помножуючою матриці вибирається обернена до діагональної частини матриці А : С=D . Якщо ж умова діагональної переваги не виконується , то необхідно при допомозі лінійних перетворень звести систему (1) , до еквівалентної Ах=В ,так щоб для неї виконувалась ця умова ,і тоді можна використовувати метод Якобі.
Принцип роботи:
Запустивши програму ми можемо побачити титулку курсової роботи.
Текст програми
//----------------------------------------------------------------------------------------------------
#include
#include
#include
#include
#include
#define N 10
float a[N][N],b[N],x[N],y[N];
float sam [N],dil[N];
void maxa(void)
{
float suma;
int n,i,j,q;
char calo;
restorecrtmode();
printf("Введiть кiлькiсть елементiв");
scanf("%d",&n);
if (n>10)n=10;
//-----введення чисел а------------
printf("якщо не хочете вводить числа то натисныть 1 , инакше будуте вводить");
calo=getch();
if(calo==49)
{ for(i=0;i
for(j=0;j
a[i][j]=rand()%100;
//-----введення чисел в------------
for(i=0;i
b[i]=rand()%100;}else
{
for(i=0;i
for(j=0;j
{printf("\nВведить a[%d][%d]=",i+1,j+1);
scanf("%f",&a[i][j]);
}
for(i=0;i
{ printf("\nВведить b[%d]=",i+1);
scanf("%f",&b[i]);
}}
//-------------------------
for(i=0;i
x[i]=b[i]/a[i][i];
for(q=0;q<10;q++)
{
for(i=0;i
{for(j=0;j
if(j==i)suma=suma;
else suma+=x[j]*a[i][j];
y[i]=(b[i]-suma)/a[i][i];
if((y[i]-x[i])<=0.000001) goto max;
}
for(i=0;i
x[i]=y[i];
}
max:
for(i=0;i
printf("\nx[%d]=%f",i+1,x[i]);
for(i=0;i
suma+=a[i][0]*y[i];
printf("\n=%f",suma-b[0]);
getch();
setgraphmode(getgraphmode());
}
void help(void)
{ restorecrtmode();
clrscr();
textmode(BW80);
textcolor(7);
cprintf(" Мiнiстерство освiти i науки України");
printf("\n");
cprintf(" Рiвненський державний технiчний унiверситет");
printf("\n");
cprintf(" Кафедра електротехнiки i автоматики");
printf("\n\n\n\n\n");
textcolor(4);
printf(" ");
cprintf("КУРСОВА РОБОТА");
printf("\n");
textcolor(7);
printf("\t\t");
cprintf(" з курсу:\"Програмування та алгоритмiчнi мови\"");
printf("\n");
textcolor(7);
printf("\t\t");
cprintf(" на тему:\Розв'язання системи рiвнянь за ");
printf("\n");
printf("\t\t\t ");
cprintf("допомогою методу iтерацiй\"");
printf("\n\n\n\n\n\n");
textcolor(2);
printf("\t\t\t\t\t\t");
cprintf("Виконав студент першого курсу");
printf("\n");
printf("\t\t\t\t\t\t");
cprintf("групи АУТП-2");
printf("\n");
printf("\t\t\t\t\t\t");
cprintf("Лотоцький Максим");
printf("\n\n\n\n");
printf("\t\t\t ");
textcolor(58);
cprintf("РIВНЕ-2002");
textcolor(14+128 );
printf("\n\t\t\t");
cprintf(" натиснiть будь-яку клавiшу");
getch();
textcolor(GREEN );
setgraphmode(getgraphmode());
}
void draw(int x0,int y0)
{
unsigned char color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};
struct bmpinfo
{
char h1,h2;
unsigned long
size,reserved,offset,b,width,height;
unsigned int plans,bpp;
};
bmpinfo info;
FILE *f;
int x,y;
unsigned char b;
unsigned char bh;
unsigned char bl;
int nb;
int np;
int i,j;
if((f=fopen("34_.bmp","rb"))==NULL)
printf("-1");
//return -1;
fread(&info,sizeof(info),1,f);
if(info.bpp!=4)
printf("-2");
//return -2;
x=x0;
y=y0+info.height;
nb=(info.width/8)*4;
if((info.width/8)!=4)nb+=4;
fseek(f,info.offset,SEEK_SET);
for(i=0;i<=info.height;i++)
{
np=0;
for(j=4;j
{
b=fgetc(f);
if(np
{
bh=b>>4;
putpixel(x,y,color[bh]);
x++;
np++;
}
if (np
{
bl=b&15;
putpixel(x,y,color[bl]);
x++;
np++;
}
}
x=x0;
y--;
}
fclose(f);
}
void Pidgotovka(void);
void *saucer;
int size;
void max(void);
main()
{
int q,X,y,c,STEP=200;
int gdriver=DETECT,gmode,errorcode;
initgraph(&gdriver,&gmode,"c:\\bcpp\\bgi");
errorcode=graphresult();
if(errorcode !=grOk)
{
printf("Помилка графiчного режиму типу:%s\n",grapherrormsg(errorcode));
printf("Натиснiть будь-яку клавiшу для виходу");
getch();
exit(1);
}
help();
poch:
q=1;
X=69;
y=111;
Pidgotovka();
do
{
putimage(X,y,saucer,XOR_PUT);
c=getch();
putimage(X,y,saucer,XOR_PUT);
switch(c)
{
case 80:y+=STEP;q++;if(y==511){y=111 ;q=1;}break;
case 72: y-=STEP;q--;if(y==-89){y=311;q=2;}break;
case 13: if(q==2)goto popa;if(q==1){maxa();
goto poch; }
}
} while(c!=27);
popa:
free(saucer);
closegraph();
}
void Pidgotovka(void )
{
draw(0,-2);
size=imagesize(69,111,207,177);
saucer=malloc(size);
getimage(69,111,207,177,saucer);
putimage(69,111,saucer,XOR_PUT);
}
Приклад
Запустивши перший пункт меню будемо мати :
Введiть кiлькiсть елементiв6
якщо не хочете вводить числа то натисныть 1 , инакше будуте вводить
x[1]=0.802469
x[2]=0.831579
x[3]=0.978261
x[4]=0.000000
x[5]=0.716216
x[6]=0.371795
перевірка:
=0.000000
Висновок
Завдяки цій курсовій роботі я закріпив здобуті теоретичні знання з курсу “Програмування та алгоритмічні мови”,навчився застосувати їх при вирішенні питань виробничого характеру. Склав програму, яка знаходила корені системи рівняннь за допомогою методу простої ітерації .
Література
1.Головко Д.Б. і ін. Автоматика і автоматизація технологічних процесів,
“Либідь”, 1997 р., 230 с.
2.Крис Паппас, Уїльям Мюррей, Програмирование на С и С++,
“Ирина”, BHV,Киев,2000.