Реферат: Основы программирования

Федеральноеагентство по образованию

Арзамасскийполитехнический институт (филиал)

Государственноеобразовательное учреждение высшего профессионального образования

«Нижегородскийгосударственный технический университет» им. Р.Е. Алексеева

Кафедра «Прикладнаяматематика»

Курсовая работа

по дисциплине

«Алгоритмическиеязыки и программирование»

Выполнил студент

группы АСПМ 09-1

Балахонова О.В.

Проверил

Преподаватель

Лазарева А.Б

Арзамас 2010


1.Введение

2.Задача № 1

2.1Блок – схема для ввода данных

2.2Блок – схема для удаления элемента

2.3Блок – схема для добавления элемента

2.4 Блок – схема главной функции

2.5 Листинг программы

2.6 Результаты работы программы

3. Задача № 2

3.1Постановка задачи

3.2Блок – схема для конструктора

3.3Блок – схема для конструктора копий

3.4Блок – схема для деструктора

3.5Блок – схемы для доступа к закрытым полям

3.6Блок – схема для перестановки

3.7Блок – схема для приведения к треугольному виду

3.8Блок – схема для аппроксимации

3.9Блок-схема для обратной подстановки

3.10Блок-схема для вычисления интеграла методом левых прямоугольников

3.11Блок-схема для вычисления интеграла методом правых прямоугольников

3.12Блок-схема для вычисления интеграла методом центральных прямоугольников

3.13Блок-схема для вычисления интеграла методом Симпсона с автоматическим выборомшага

3.14Листинг программы

3.15Результаты работы программы

3.16Теоретические сведения

Списокиспользованных источников


1. Введение

В начале 80–х годов вфирме BellTelephone LaboratoriesБьерном Страуструпом (США) в результате дополнения и расширения языка С былсоздан язык, получивший название «С с классами». В 1983г. Этоназвание было изменено на С++. В 1998г. Был утвержден окончательный стандартязыка С++.

В настоящее время С++является одним из наиболее распространенных и востребованных языковпрограммирования. Этот язык представляет собой фундамент, на котором строитсясовременное программирование, поэтому он является обязательным элементомподготовки современных программистов, именно поэтому для студентовспециальностей «Прикладная математика» и «Информационные системыи технологии» выбран этот язык.


2. Задача№ 1

Постановка задачи

Создать файл и записатьв него объекты структуры. Структура должна быть со следующими полями:

· Названиекоманды

· Город

· Количествоигроков

· Количествонабранных очков

Из объектов структурысоздается массив, заносится в файл. Вывести созданный файл на монитор, удалитьиз файла все элементы с количеством очков меньше заданного. Измененную базуданных записать в другой файл. Добавить К элементов в начало файла.

2.1Блок– схема для ввода данных

/>


2.2 Блок– схема для удаления элемента

/>


2.3 Блок – схема длядобавления элемента

/>


2.4Блок – схема главной функции

/>

2.5Листингпрограммы

#include<iostream>

#include<string>

#include<cstdio>

#include<windows.h>

#include<fstream>

usingnamespace std;

structset

{charname[50];

charcity[20];

intpl;

intpoint;

};

voiddata(set a1[50],int& kol );

voidudal(set a[50],ofstream& f,char str[15],int& kol);

voidvvodf(char str[15],ofstream& f,set a[50],int& kol);

voiddobav(set a[50],ofstream& f,char str[15],int& kol);

voidvivod(set a[50],int& kol);

//главнаяфункция

voidmain()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

seta[50];

intd;

ofstreamf1;

charstr1[15];

cout<<«Введитеполноеимяфайла\n»; cin>>str1;

data(a,d);

vvodf(str1,f1,a,d);

udal(a,f1,str1,d);

dobav(a,f1,str1,d);

}

//вводданных

voiddata(set a1[50],int& kol)

{cout<<"\n Сколько записей вы хотите ввести? \n";

cin>>kol;

for(inti=0;i<kol;i++)

{

cout<<"\nВведите название команды "<<i+1<<"\n";

gets(a1[i].name);

cin.getline(a1[i].name,sizeof(a1[i].name));

cout<<"\nВведите название города \n";

cin>>a1[i].city;

cout<<"\nВведите количество игроков \n";

cin>>a1[i].pl;

cout<<"\nВведите набранных очков \n";

cin>>a1[i].point;

}

vivod(a1,kol);

}

//вводвфайл

voidvvodf(char str[15],ofstream& f,set a[50],int& kol)

{f.open(str);

if(f.fail()){cout<<«Ошибка привводефайла»;exit(1);}

for(inti=0;i<kol;i++)

{f<<"***********************************************"<<endl;

f<<«Названиекоманды»<<i+1<<":"<<a[i].name<<endl;

f<<«Город:»<<a[i].city<<endl;

f<<«Количествоигроков: „<<a[i].pl<<endl;

f<<“Количествоочков:»<<a[i].point<<endl;

f<<endl<<endl;

}

f.close();

}

//удалениеэлемента

voidudal(set a[50],ofstream& f,char str[15],int& kol)

{cout<<«Введите количество очков и все команды с меньшим значениембудут удалены »;

intef; cin>>ef; int z=0;int q=0;int m=0;

for(inti=0;i<kol;i++)

{if(a[i].point<ef){z=i;

for(inti=z;i<kol;i++)

a[i]=a[i+1];

kol--;

m=1;

}

if(m==1) {i--;m=0;}

}

vvodf(str,f,a,kol);

vivod(a,kol);

}

//добавлениеэлемента

voiddobav(set a[50],ofstream& f,char str[15],int& kol)

{

intkoldob,nom=0;

cout<<"\nСколько записей вы хотите добавить? \n";cin>>koldob;

for(inti=kol-1;i>=nom;i--) a[i+koldob]=a[i];

f.open(str);

if(f.fail()){cout<<«Ошибка открытиифайла»;exit(1);}

for(inti=nom;i<nom+koldob;i++)

{

cout<<"\nВведите название команды "<<i+1<<" которую вы хотитедобавить\n";

gets(a[i].name);

cin.getline(a[i].name,sizeof(a[i].name));

cout<<"\nВведите название города \n";

cin>>a[i].city;

cout<<"\nВведите количество игроков\n";

cin>>a[i].pl;

cout<<"\nКоличествоочков\n";

cin>>a[i].point;

}

kol=kol+koldob;

f.close();

vvodf(str,f,a,kol);

vivod(a,kol);

}

voidvivod(set a[50],int& kol)

{cout<<endl;

for(inti=0;i<kol;i++)

{cout<<"***********************************************"<<endl;

cout<<«Названиекоманды»<<i+1<<":"<<a[i].name<<endl;

cout<<«Город:»<<a[i].city<<endl;

cout<<«Количествоигроков:»<<a[i].pl<<endl;

cout<<«Количествоочков:»<<a[i].point<<endl;

cout<<endl<<endl;

}

}

2.6 Результаты работыпрограммы

Введите полное имяфайла

Команда

Сколько записей выхотите ввести?

4

Введите название команды1

Спартак

Введите название города

Москва

Введите количествоигроков

21

Введите набранных очков

42

Введите названиекоманды 2

ЦСКА

Введите название города

Москва

Введите количествоигроков

21

Введите набранных очков

38

Введите названиекоманды 3

Локомотив

Введите название города

Москва

Введите количествоигроков

21

Введите набранных очков

30

Введите названиекоманды 4

Томь

Введите название города

Томь

Введите количествоигроков

21

Введите набранных очков

26

Названиекоманды1: Спартак

Город: Москва

Количество игроков:21

Количество очков:42

Название команды2: ЦСКА

Город: Москва

Количество игроков:21

Количество очков:38

Названиекоманды3: Локомотив

Город: Москва

Количество игроков:21

Количество очков:30

Название команды4: Томь

Город: Томь

Количество игроков:21

Количество очков:26

Введите количествоочков и все команды с меньшим значением будут удалены 38

Названиекоманды1: Спартак

Город: Москва

Количество игроков:21

Название команды2: ЦСКА

Город: Москва

Количество игроков:21

Количество очков:38

Сколько записей вы хотитедобавить?

1

Введите названиекоманды 1 которую вы хотите добавить

Спартак

Введите название города

Нальчик

Введите количествоигроков

21

Количество очков

28

Названиекоманды1: Спартак

Город: Нальчик

Количество игроков:21

Количество очков:28

Название команды2: Спартак

Город: Москва

Количество игроков:21

Количество очков:42

Название команды3: ЦСКА

Город: Москва

Количество игроков:21

Количество очков:38

Для продолжения нажмителюбую клавишу… .


3. Задача№ 2

3.1 Постановка задачи

Дана таблица значенийфункции. Требуется аппроксимировать ее полиномом 6й степени.

Для решения задачинеобходимо решать систему линейных уравнений методом Гаусса или итераций.

Для решения системылинейных уравнений методом Гаусса необходимо создать классы с одномернымдинамическим массивом и двумерным динамическим массивом, в которых должны быть:

· Конструктор;

· Конструкторпо умолчанию;

· Конструкторкопий;

· Деструктор;

· Методыдоступа к закрытым полям;

· Методдля инициализации закрытого поля.

Вне классов должныперегружаться операции вставки и извлечения.

Должны быть добавленыфункции или дружественные функции для:

1. Левыхпрямоугольников;

2. Правыхпрямоугольников;

3. Центральныхпрямоугольников;

4. МетодомСимпсона с автоматическим выбором шага.


3.2Блок– схема для конструктора

/>


3.3 Блок – схема дляконструктора копий

/>

3.4 Блок – схема длядеструктора

/>


3.5 Блок – схемы длядоступа к закрытым полям

/>


3.6 Блок – схема дляперестановки

/>

/>


3.7 Блок – схема дляприведения к треугольному виду

/>

/>


3.8 Блок – схема дляаппроксимации

/>

/>


3.9 Блок-схема дляобратной подстановки

/>

/>


3.10 Блок-схема длявычисления интеграла методом левых прямоугольников

/>

/>



3.11 Блок-схема длявычисления интеграла методом правых прямоугольников

/>

/> /> /> /> /> /> /> /> /> />

i=0

  /> /> <td/>

y=y+f(X,z)

  /> /> />

z=z+h

  /> /> />

i++

  /> /> /> /> /> />

y=y*h

  /> /> /> />

3.12 Блок-схема длявычисления интеграла методом центральных прямоугольников

/>

/>


3.13 Блок-схема длявычисления интеграла методом Симпсона с автоматическим выбором шага

/>


/>

/>

3.14Листингпрограммы

#include<iostream>

#include<cstdlib>

#include<cstddef>

#include<iomanip>

#include<cmath>

#include<fstream>

usingnamespace std;

classarray1

{double*a;

intn;

public:

array1(intnn);

array1();

array1(constarray1& ob);

~array1();

intgetn();

double&geta(int n);

voidset1(int i,double v);

};

classarray2

{double**b;

intn,m;

public:

array2(intnn,int nm);

array2();

array2(constarray2& ob);

~array2();

intgetn();

intgetm();

double&getb(int k,int l);

voidset(int i,int j,double v);

};

//конструкторarray1

array1::array1(intnn)

{n=nn;

a=newdouble [n];

if(a==NULL){cout<<"\n нет оп";

exit(1);

}

}

//конструкторпо умолчанию array1

array1::array1()

{

}

//деструкторarray1

array1::~array1()

{

}

//конструкторкопий array1

array1::array1(constarray1 &ob)

{n=ob.n;

a=newdouble[n];

if(a==NULL){cout<<"\n нет оп" ;

exit(1);

}

for(int i=0;i<n;i++)

a=ob.a;

}

//методыдоступа array1

intarray1::getn()

{returnn;

}

double&array1::geta(int r)

{returna[r];

}

voidarray1::set1(int i,double v)

{a[i]=v;

}

//операцияизвлечения

istream&operator>>(istream& stream, array1& ob)

{inti; double temp;

for(i=0;i<ob.getn();i++)

{stream>>temp;

ob.set1(i,temp);

}

returnstream;

}

//операциявставки

ostream&operator<<(ostream& stream, array1& ob)

{inti;

for(i=0;i<ob.getn();i++)

stream<<setw(10)<<ob.geta(i);

returnstream;

}

//конструкторarray2

array2::array2(intnn,int nm)

{n=nn;

m=nm;

b=newdouble* [n];

if(b==NULL){cout<<"\n НеТ ОП";exit(1);}

for(inti=0;i<n;i++)

{b[i]=newdouble [m];

if(b[i]==NULL){cout<<"\n НеТ ОП";exit(1);}

}

}

//конструкторпо умолчанию array2

array2::array2()

{

}

//конструкторкопийarray2

array2::array2(constarray2 &ob)

{n=ob.n;

m=ob.m;

b=newdouble* [n];

if(b==NULL){cout<<"\n НеТ ОП";

exit(1);

}

for(inti=0;i<n;i++)

for(intj=0;j<m;j++)

b[i][j]=ob.b[i][j];

}

//деструкторarray2

array2::~array2()

{//delete[]a;

}

//методыдоступаarray2

intarray2::getn()

{returnn;

}

intarray2::getm()

{returnm;

}

double&array2::getb(int k,int l)

{returnb[k][l];

}

voidarray2::set(int i,int j,double v)

{b[i][j]=v;

}

//операцияизвлечения

istream&operator>>(istream& stream, array2& ob)

{inti,j;

doubletemp;

for(i=0;i<ob.getn();i++)

for(j=0;j<ob.getm();j++)

{stream>>temp;

ob.set(i,j,temp);

}

returnstream;

}

//операциявставки

ostream&operator<<(ostream& stream, array2& ob)

{inti,j;

for(i=0;i<ob.getn();i++)

{stream<<endl;

for(j=0;j<ob.getm();j++)

stream<<setw(10)<<ob.getb(i,j);

}

returnstream;

}

//перестановкауравнений

voidPerestanovka(array2& a,array1& b,int k)

{intl=k;

doublep=0;

for(intw=k;w<a.getn();w++)

if(fabs(a.getb(w,k))>a.getb(l,k))l=w;

if(l!=k){for(int w=k;w<a.getn();w++)

{p=a.getb(k,w);

a.getb(k,w)=a.getb(l,w);

a.getb(l,w)=p;

}

p=b.geta(k);

b.geta(k)=b.geta(l);

b.geta(l)=p;

}

}

//привидениесистемы к треугольному виду

voidTreugol(array2& a,array1& b)

{doublem;

for(intk=0;k<a.getn()-1;k++)

{for(inti=k+1;i<a.getn();i++)

{Perest(a,b,k);

m=a.getb(i,k)/a.getb(k,k);

a.getb(i,k)=0;

for(intj=k+1;j<a.getn();j++)

a.getb(i,j)=a.getb(i,j)-m*a.getb(k,j);

b.geta(i)=b.geta(i)-m*b.geta(k);

}

}

}

//получениенеизвестных

array1Pods(array2& a,array1& b)

{array1x(a.getn());

doubles=0;

for(inti=0;i<a.getn();i++)

x.geta(i)=0;

x.geta(a.getn()-1)=b.geta(a.getn()-1)/a.getb(a.getn()-1,a.getn()-1);

for(inti=a.getn()-2;i>=0;i--)

{s=0;

for(intj=i+1;j<a.getn();j++)

s=s+a.getb(i,j)*x.geta(j);

x.geta(i)=(b.geta(i)-s)/a.getb(i,i);

}

returnx;

}

voidvivod(array1& X)

{cout<<endl;

for(inti=0;i<X.getn();i++)

{cout<<"="<<"("<<X.geta(i)<<"*x^"<<X.getn()-i-1<<")";}

}

//аппроксимация

voidAppr(array1 &x,array1& y,int N,array2& C,array1& D)

{array1X(N+1);

for(inti=0;i<=N;i++)

for(intj=0;j<=N;j++)

{C.getb(i,j)=0;

D.geta(j)=0;

for(intk=0;k<x.getn();k++)

{C.getb(i,j)=C.getb(i,j)+pow(x.geta(k),N*2-i-j);

D.geta(j)=D.geta(j)+y.geta(k)*pow(x.geta(k),N-j);

}

}

doublep=0;

for(intj=0;j<N;j++)

for(intk=0;k<N;k++)

{p=C.getb(j,k);

C.getb(j,k)=C.getb(k,j);

C.getb(k,j)=p;

}

}

//полученнаяфун-я

doublef(array1& X,double z)

{doubley=0;

for(inti=0;i<X.getn();i++)

y=y+X.geta(i)*pow(z,X.getn()-i-1);

returny;

}

//методлевыхпрямоугольников

doubleLevPR(array1& X,int KTR,array1& x)

{double h=0;

doublez=0;

doublea=x.geta(0);

doubleb=x.geta(x.getn()-1);

h=(b-a)/KTR;

doubley=0;

z=a+h;

for(inti=1;i<KTR;i++)

{y=y+f(X,z);

z=z+h;

}

y=y*h;

returny;

}

//методправыхпрямоугольников

doublePravPr(array1& X,int KTR,array1& x)

{doubleh=0;

doublez=0;

doublea=x.geta(0);

doubleb=x.geta(x.getn()-1);

h=(b-a)/KTR;

doubley=0;

z=a+h;

for(inti=0;i<KTR-1;i++)

{y=y+f(X,z);

z=z+h;

}

y=y*h;

returny;

}

//методцентральныхпрямоугольников

doubleCentrPr(array1& X,int KTR,array1& x)

{doubleh=0;

doublez=0;

doublea=x.geta(0);

doubleb=x.geta(x.getn()-1);

h=(b-a)/KTR;

doubley=0;

z=a;

for(inti=0;i<KTR;i++)

{y=y+f(X,z+h/2);

z=z+h;

}

y=y*h;

returny;

}

//МетодСимпсона с автомат. выбором шага

doubleSimpson(array1& X,int KTR,array1& x)

{doublez1, h, c, s, y, IY, eps,z,n,m;

inti;

doublea=x.geta(0);

doubleb=x.geta(x.getn()-1);

n=KTR;

eps=1E-310;

IY=0;

h=(b-a)/n;

do

{c=(b-a)/(3*n);

m=n/2;

y=0;

z=a+h;

for(i=1;i<=(2*m-1);i=i+2)

{y=y+f(X,z);

z=z+2*h;

}

y=4*y;

s=0;

z=a+2*h;

for(i=2;i<=(2*m-2);i=i+2)

{s=s+f(X,z);

z=z+2*h;

}

s=2*s;

z1=c*(f(X,a)+f(X,b)+s+y);

h=h/2;

n=n*2;

if(fabs(z1-IY)>eps)IY=z1;

}

while(fabs(z1-IY)>eps);

returnz1;

}

//выводизфайла

voidoutputf(ifstream& f,char S[40],array1& v)

{doublenext;int i=0;

f.open(S);

if(f.fail()){cout<<" Error";

exit(1);

}

while(f>>next)

{v.geta(i)=next;

i++;

}

f.close();

}

//Главнаяфункция

voidmain()

{cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(2);

setlocale(LC_ALL,«Russian»);

intn,N;

cout<<"\nВведите количество элементов векторов x и y \n";

cin>>n;

array1x(n),y(n);

cout<<"\n**Введите степень полинома**\n";

cin>>N;

charS[40];

charS1[40];

cout<<"\nВведите путь к вектору x \n";

cin>>S;

cout<<"\nВведите путь к вектору y \n";

cin>>S1;

ifstreamf,f1;

cout<<"*****Векторx*****";

outputf(f,S,x);

cout<<x<<endl;

cout<<endl<<"*****Векторy*****"<<endl;

outputf(f1,S1,y);

cout<<y<<endl;

array2C(N+1,N+1);array1 D(N+1);

Appr(x,y,N,C,D);

Treugol(C,D);

cout<<"\n***************МатрицаC***************\n"<<C<<endl;

cout<<"\n***************ВекторD***************\n"<<D<<endl;

array1X(N+1);

X=Pods(C,D);cout<<"\n****Коэффициенты****\n"<<X<<endl;

vivod(X);

doubleI=0;

doubleI2=0;

doubleI3=0;

doubleI4=0;

cout<<"\nВведитеколичествоточекразбиения\n";

intKTR=0;

cin>>KTR;

I=LevPr(X,KTR,x);

cout<<"\nИнтеграл методом левых прямоугольников \n"<<I;

I2=PravPr(X,KTR,x);

cout<<"\nИнтеграл методом правых прямоугольников\n"<<I2;

I3=CentrPr(X,KTR,x);

cout<<"\nИнтеграл методом центральных прямоугольников\n"<<I3;

I4=Simpson(X,KTR,x);

cout<<"\nИнтеграл методом Симпсона с автоматическим выбором шага\n"<<I4;

cout<<endl;

}

3.15 Результаты работыпрограммы

Введите количествоэлементов векторов x и y

51

**Введите степеньполинома**

6

Введите путь к векторуx

D:\c++\x.txt

Введите путь к векторуy

D:\c++\y.txt

*****Вектор x***** -5.00-4.80 -4.60 -4.40 -4.20 -4.00

-3.80 -3.60 -3.40 -3.20-3.00 -2.80 -2.60 -2.40

-2.20 -2.00 -1.80 -1.60-1.40 -1.20 -1.00 -0.80

-0.60 -0.40 -0.20 0.00 0.200.40 0.60 0.80

1.00 1.20 1.40 1.60 1.802.00 2.20 2.40

2.60 2.80 3.00 3.20 3.403.60 3.80 4.00

4.20 4.40 4.60 4.80 5.00

*****Вектор y*****

123863.00 96837.80 74907.1557273.05 43235.06 32182.00 23584.04 16985.15

11995.90 8286.62 5581.003649.95 2305.94 1397.61 804.81 434.00

214.01 92.15 30.74 3.94-5.00 -6.11 -4.77 -3.34

-2.47 -2.00 -1.53 -0.591.52 6.31 17.00 39.84

85.73 172.28 326.19 586.001005.27 1656.04 2632.71 4056.29

6079.00 8889.25 12716.9717839.36 24586.94 33350.00 44585.45 58823.97

76677.60 98847.65126133.00

***************МатрицаC********************

1202617144.06 -0.0054804623.210.002581573.91 0.00 127856.81

0.0054804623.21 0.002581573.910.00 127856.81 0.00

0.00 0.00 84065.25 -0.0010211.57 -0.00 1065.08

0.00 0.00 0.00 6251.67 0.00868.96 0.00

0.00 0.00 0.00 0.00 109.56-0.00 38.16

0.00 0.00 0.00 0.00 0.0022.93 0.00

0.00 0.00 0.00 0.00 0.000.00 10.62

***************ВекторD********************

9620681443.2223489892.10-2130.89 58003.22 -76.32 45.85 -21.24

****Коэффициенты****

8.00 -0.00 -0.00 9.00 -0.002.00 -2.00

+(8.00*x^6)+(-0.00*x^5)+(-0.00*x^4)+(9.00*x^3)+(-0.00*x^2)+(2.00*x^1)+(-2.00*x^0)

Введите количествоточек разбиения

10000000

Интеграл методом левыхпрямоугольников

178551.30

Интеграл методом правыхпрямоугольников

178551.30

Интеграл методомцентральных прямоугольников

178551.43

Интеграл методомСимпсона с автоматическим выбором шага

178551.43

Для продолжения нажмителюбую клавишу

3.16 Теоретическиесведения

Решение системылинейных уравнений методом Гаусса

Проиллюстрируем методна системе из трех линейных уравнений с тремя неизвестными

/> (1)

В такой системе, покрайней мере, один из коэффициентов /> отличенот нуля. Уравнения необходимо переставить таким образом, чтобы на месте первогоуравнения было уравнение с максимальным отличным от нуля коэффициентом при Х=0.Далее вводится множитель /> , нанего умножается первое уравнение системы и вычитается из второго уравнения. Приэтом мы получим

/>

Третье уравнениесистемы (1) умножим на коэффициент /> ивычтем из второго уравнения первое уравнение, умноженное на этот коэффициент. Врезультате получим

/>

Таким образом системауравнений (1) приводится к виду:


/> (2)

Для системы уравнений(2) введем множитель /> , умножим нанего второе уравнение системы (2) и вычтем из третьего уравнения. В результатетретье уравнение системы (2) примет вид:

/>

Тогда система уравнений(2) примет вид:

/> (3)

Мы получили треугольнуюсистему уравнений и необходимо выполнить обратную подстановку для вычислениянеизвестных.

Обобщим метод на случайсистемы из n уравнений с nнеизвестными.

/>

На k-омэтапе мы исключаем из системы уравнений />спомощью множителей

/> 

/>

/> ,гдеi=k+1, k+2,…,n-1

J=k,k+1,…,n-1

Индекс kпринимает значения k=0,1,…,n-2включительно. При k=n-2происходит исключение /> из последнегоуравнения и в результате получится треугольная система уравнений.

/>


/>

В представленнойблок-схеме все множители, на которые нужно умножать уравнения, обозначаембуквой m, т. к. на каждом этапетребуется не более 1-го множителя.

k-номеруравнения, который вычитается из остальных, а также неизвестного, которыйисключается из остальных n-kуравнений

i-номеруравнения, из которого в данный момент исключается неизвестное, j-номерстолбца

После приведениясистемы к ∆-му виду необходимо сделать обратный ход для нахождениянеизвестных, значения которых будут вычисляться по формуле:

/>

Где j-n-2,n-3,…,0

Начертим блок-схему дляфункции обратной подстановки


/>

/>

Начертим блок-схему дляфункции определения наибольшего коэффициента /> иперестановки уравнений при необходимости.


/>

Аппроксимация функцийметодом наименьших квадратов

Пусть в результатеэксперимента получается следующая таблица значений:

x0

x1

xn-1

y0

y1

yn-1

Требуется найтианалитический вид функции, которая в точках x0,x1,…,xn-1будетиметь значения достаточно близкие к y0,y1,…,yn-1.

Рассмотрим наиболеепростой вид аппроксимации, т.е. замены таблицы значений аналитическим видом функции– аппроксимацию линейной функцией, т.е. будем находить функцию y=a0*x+a1,из которой в точках x0,x1,…,xn-1значения будут близки к y0,y1,...,yn-1.В качестве критерия близости будем рассматривать квадратичный критерий качества

/> (1)

Необходимо найтикоэффициенты a0и a1,чтобы критерий качества стремился к минимуму. Как известно, необходимое условиеминимума – равенство 0 первых производных функции по соответствующимпеременным. Найдем производные критерия качества (1) по переменным a0и a1

/> (2)<sub/>

Разделим каждое изуравнений системы (2) на -2 и поставим неизвестные перед коэффициентами

/> (3)

Система (3) – системаиз двух линейных уравнений с двумя неизвестными. Будем решать его методомалгебраического сложения. Первое уравнение системы (3) умножим на n,а второе уравнение на /> и вычтем изпервого уравнения второе, из второго уравнения системы (3) получим выражениедля a1

/>

/>

Аппроксимацияквадратичной функции:

Пусть дана таблицазначений

x0

x1

………

xn-1

y0

y1

………

yn-1

Требуетсяаппроксимировать эту таблицу полиномом третьего порядка, т.е. требуется найтикоэффициенты полинома y=a0x2+a1x+a2,который в точках x0, x1,…, xn-1имеет значения достаточно близкие к y0, y1, …, yn-1.

В качестве критерияблизости выберем квадратичный критерий качества, который должен стремиться кминимуму.

a=/> (1)

Найдем производныефункции (1) по переменным а0, а1 и а2.

2*/>

(2) 2*/> 

2*/>


Разделим каждоеуравнение системы (2) на (-2) и поставим коэффициенты после неизвестных

/>

(3) />

/>

Система уравнений (3)это система из трех линейных уравнений с тремя неизвестными, которую необходиморешать методом Гаусса или итерации.

Для того, чтобы решитьсистему методом Гаусса необходимо вычислить коэффициенты при неизвестных а0, а1 и а2 и записать их в соответствующие переменные и,может быть, выполнить переобозначение, так как при решении системы уравненийметодом Гаусса систему уравнений мы записывали в виде:

a00*x0+a01*x1+…+a0,n-1=b0

a10*x0+a11*x1+…+a1,n-1=b1

………………………………………...

an-1,0*x0+an-1,1*x1+…+an-1,n-1=bn-1

или систему уравненийрассмотрим в виде:

x00*a0+x01*a1+…+x0n-1=b0

x10*a0+x11*a1+…+x1n-1=b1

…………………………..


Список использованныхисточников

1) Программированиена С++ в среде VisualStudio C++.NET: учеб. пособие / А. Б. Лазарева,А. В. Троицкий, С. Н. Митяков – Н. Новгород, 2008.-334

2) Алгоритмическиеязыки и программирование: методические указания к курсовой работе для студентовспециальностей 230401.65 / А. Б. Лазарева, Т. Е. Жилина – АПИ НГТУ 2010.-43

еще рефераты
Еще работы по информатике, программированию