Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Контрольная работа - файл 1.doc


Контрольная работа
скачать (282.5 kb.)

Доступные файлы (1):

1.doc283kb.04.12.2011 22:37скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...

1. Решение систем линейных алгебраических уравнений (СЛАУ)



Составить программу решения СЛАУ порядка n и решить систему линейных уравнений пятого порядка с трехдиагональной симметричной матрицей вида




вар.

Mетод

d

q



5

MP

-3

-4.67

-


Решение:

Программа для решения СЛАУ методом прогонки приведена в листинге 1.1.

Результаты работы программы приведены на рис. 1.1.
Листинг 1.1.

#include "stdafx.h"

#include <math.h>

#include <iostream>
using namespace std;
int i,n,k,n1=5;

double t,z,q,d;

double A[5][5];

double B[5];

double eps[5];

double X[5];

double et[5];

int main()

{

for (i=0;i<5;i++)

{

for (k=0;k<5;k++)

{

A[i][k]=0;

}

}

cout<<"Enter q: ";

cin>>q;

cout<<endl<<"Enter d: ";

cin>>d;

cout<<endl;
A[0][0]=A[4][4]=q;

A[1][1]=A[2][2]=A[3][3]=-2;

for (i=0;i<4;i++)

{

k=i+1;

A[i][k]=A[k][i]=1;

}
cout<<"Matrix A:"<<endl;

for (i=0;i<5;i++)

{

for (k=0;k<5;k++)

{

cout<<A[k][i]<<"\t ";

}

cout<<endl;

}

B[0]=B[4]=0;

for(i=1;i<=3;i++)

{

B[i]=d;

}

cout<<"Matrix B:"<<endl;

for (i=0;i<5;i++)

{

cout<<B[i]<<endl;

}

n=n1-1;

eps[0]=-A[0][1]/A[0][0];

et[0]=B[0]/A[0][0];

for(i=1;i<n;i++)

{

z=A[i][i]+A[i][i-1]*eps[i-1];

eps[i]=-A[i][i+1]/z;

et[i]=(B[i]-A[i][i-1]*et[i-1])/z;

}

X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);

for(i=n-1;i>=0;i--)

{

X[i]=eps[i]*X[i+1]+et[i];

}

cout<<"Matrix X:"<<endl;

for(i=0;i<n1;i++)

{

cout<<X[i]<<endl;

}

return 0;

}



Рис.1.1.
^

2.Аппроксимация функций



Требуется аппроксимировать заданную исходную функцию f(x) многочленом на интервале [a, b]. Задано количество неизвестных параметров n, вид аппроксимации и m - количество точек, в которых задана функция. Таблица исходной функции yi=f(xi) вычисляется в точках xi=a+(i-1)(b-a)/(m-1), i=1, m. Используя полученную таблицу (xi, yi), требуется вычислить значения функций f(xj), φ(xj, c) и погрешность d(xj)=f(xj)-φ(xj, c) в точках xj=a+(j-1)(b-a)/20, j=1, 20.


N

Функция f(x)

a

b

m

n

Вид аппроксимации

5



5

8

4

4

Общего вида POL


Решение:

Код программы приведен в листинге 2.1.

Результаты работы программы приведены на рис. 2.1.

Листинг 2.1

#include "stdafx.h"

#include <iostream>

#include <math.h>

#include <iomanip>
using namespace std;
double countF(double x)

{

return pow(x,0.5)-pow(cos(x),2);

}

int main()

{

int n = 4;

int m = 4;

double a = 5;

double b = 8;

double X[21];

double Y[21];

double L[21];

double D[21];

double c[21];

double a1[21][21];

double d;

for(int t = 1;t <= 21;t++)

{

X[t] = 0; Y[t] = 0; L[t] = 0; D[t] = 0;

}
cout<<"The values of x,y:"<<endl;

for(int i = 1;i <= 4;i++)

{

X[i] = a + (i - 1)*(b - a)/(m - 1);

Y[i] = countF(X[i]);

cout<<"x["<<i<<"]="<<X[i]<<"\t\t";

cout<<"y["<<i<<"]="<<Y[i]<<endl;

}
for(int k = 1;k <= n;k++)

{

a1[k][1]=1;

int i=0;

for(int s = 2;s <= n;s++)

{

i=i+1;

if(i==k)

{

i=i+1;

}

d=X[k]-X[i];

a1[k][s]=a1[k][s-1]/d;

for(int j = s-1;j >= 2;j--)

{

a1[k][j]=(a1[k][j-1]-a1[k][j]*X[i])/d;

}

a1[k][1]=-a1[k][1]*X[i]/d;

}

}

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

{

c[i]=0;

for(int k = 1;k <= n;k++)

{

c[i]=c[i]+a1[k][i]*Y[k];

}

}

for(int j = 1; j <= 21; j++)

{

X[j]=a+(j-1)*(b-a)/20;

Y[j]=countF(X[j]);

L[j]=c[1]+X[j]*(c[2]+X[j]*(c[3]+X[j]*c[4]));

D[j]=fabs(Y[j]-L[j]);

}

cout<<endl;

for(int i = 1;i <= 21;i++)

{

cout<<fixed<<"X["<<i<<"]="<<X[i]<<"\t";

cout<<"Y["<<i<<"]="<<Y[i]<<"\t";

cout<<"L["<<i<<"]"<<"="<<L[i]<<"\t";

cout<<"D["<<i<<"]"<<"="<<D[i]<<endl;

}

return 0;

}


Рис. 2.1
^

3. Вычисление производных и интегралов


Задан интервал [a, b], функция f(x) и указан метод вычисления интеграла. Вначале вычислить точные выражения для первой, второй производных , и для интеграла. Составить программу, которая вычисляет таблицу значений функции, ее точных и приближенных производных в точках а также точное и приближенное значения интеграла. Расчеты производной произвести для hp =0.2, 0.1 и 0.05. Расчеты интеграла произвести для m=10, 20 и 40 с точностью =0.001.


N

Функция f(x)

Интервал

Метод

интегрирования

Значение



a

b

5



5

8

Гаусса 2

6.067

Решение:

Фрагмент программы приведен в листинге 3.1.

Результаты работы программы приведены на рис. 3.1.

Листинг 3.1

double Gauss2(double a1,double b1,double m1)

{

double s=0,sm=0,h4=0,xi0,xi1,xi2;

int im;

h4=(b1-a1)/m1;

xi0=a1+h4/2;

xi1=xi0-(h4/2)*0.5773502692;

xi2=xi0+(h4/2)*0.5773502692;

for(im=1;im<=m1;im++)

{

sm=sm+yx(xi1)+yx(xi2);

xi0=xi0+h4;

xi1=xi0-(h4/2)*0.5773502692;

xi2=xi0+(h4/2)*0.5773502692;

}

s=(h4/2)*sm;

return s;

}

int main()

{

cout<<"x\t"<<"y\t"<<"D1T\t"<<"D1\t"<<"D2T\t"

<<"D2\t"<<"del1\t"<<"del2\t"<<endl;

for(j=1;j<=21;j++)

{

x=a+(j-1)*(b-a)/20;

y=yx(x);

d1=D1F(x,h);

d2=D2F(x,h);

d1t=1/(2*pow(x,0.5))+2*sin(x)*cos(x);

del1=fabs(d1t-d1);

d2t=-1/(4*pow(x,1.5))-2*pow(sin(x),2)+2*pow(cos(x),2);

del2=fabs(d2t-d2);

cout<<x<<"\t"<<fixed<<setprecision(3)<<y<<"\t"<<d1t<<"\t"<<

d1<<"\t"<<d2t<<"\t"<<d2<<"\t"<<del1<<"\t"<<del2<<endl;

}

t=Gauss2(a,b,m);

eps=fabs(itg-t);

cout<<"Integral: "<<t<<endl<<"Error: "<<eps<<endl;

return 0;

}



Рис. 3.1
^

4. Методы решения нелинейных уравнений


Отладить программу определения всех корней функции f(x) в указанном интервале [a, b], использовать метод в соотвествии с полученным вариантом из табл. 5.1.

Программа работает следующим образом: сначала на экран выдается таблица значений функции и делается запрос на ввод начального приближения (это может быть ,  или x0) к тому корню, который надо получить с заданной точностью. После того как введены требуемые данные, идет обращение к подпрограмме и печать результатов.

N

f(x)

Интервал

метод

а

b

5



4

8

MP

Решение:

Фрагмент программы приведен в листинге 4.1.

Результаты работы программы приведены на рис. 4.1-4.2.

Листинг 4.1

double MP(double x0,double h1)

{

double eps=0.0001,x1,x2,x3,r,d,p,q,D,cc;

double z[3]={0,0,0};

double y[4]={0,0,0,0};

double zm[3]={0,0,0};

int it,s;

x1=x0-h1;

x2=x0;

x3=x0+h1;

y[1]=countF(x1);

y[2]=countF(x2);

y[3]=countF(x3);

it=0;

do

{

it=it+1;

z[1]=x1-x3;

z[2]=x2-x3;

r=y[3];

d=z[1]*z[2]*(z[1]-z[2]);

p=((y[1]-y[3])*z[2]-(y[2]-y[3])/z[1])/d;

q=-((y[1]-y[3])*pow(z[2],2)-(y[2]-y[3])*pow(z[1],2))/d;

cc=fabs(pow(q,2)-4*p*r);

D=pow(cc,0.5);

zm[1]=(-q+D)/(p*2);

zm[2]=(-q-D)/(p*2);

if(fabs(zm[1])<fabs(zm[2]))

zm[0]=fabs(zm[1]);

else

zm[0]=fabs(zm[2]);

x1=x2;

x2=x3;

y[1]=y[2];

y[2]=y[3];

x3=x3+zm[0];

y[3]=countF(x3);

s=0;

if(fabs(zm[0])<eps)

s=1;

if(it>100)

s=1;

}

while(s!=1);

return x3;

}

double a=4;

double b=8;

int m=50;

int temp;

double x,y,h,xa,z;
int main()

{

h=(b-a)/m;

x=a;

while(x<=b)

{

y=countF(x);

cout << fixed << x << "\t" << y << endl;

x=x+h;

}

do

{

cout<<endl<<"Enter x0: ";

cin>>xa;

cout<<endl;

z=MP(xa,h);

cout << "Solution: "<<z<<endl;

temp=0;

cout<<"Find more radicals? "<<endl<<"'0'-YES"<<endl<<"'1'-NO"<<endl;

cin>>temp;

}

while(temp!=1);

return 0;

}



Рис. 4.1


Рис. 4.2
^

5. Методы нахождения минимума функции одной переменной


Требуется отладить программу определения минимума указанной в таблице функции заданным методом. Сначала на экране выдается таблица значений функции и делается запрос на ввод начального приближения (,  или x0, h) для вычисления требуемого локального минимума. Расчет функции, а также метод нахождения минимума оформить в виде отдельных подпрограмм. Выбрать m - по усмотрению, точность =10-4 .

N

f(x)

Интервал

метод

а

b

5



4

20

MP3

Решение:

Код программы приведен в листинге 5.1.

Результаты работы программы приведены на рис. 5.1.

Листинг 5.1

// Ganisevsky5_MP3.cpp : Defines the entry point for the console application.

//
#include "stdafx.h"

#include "stdafx.h"

#include <iostream>

#include <math.h>
using namespace std;
double countF(double x1)

{

return pow(x1,0.5)-cos(x1);

}
double countD(double x1d)

{

return 1/(2*pow(x1d,0.5))+sin(x1d);

}
double MP3(double a, double b, double e)

{

int m1=200;

double x1,x2,x3,h1,z1;

double zm=0;

double D1,D2,Y1,Y2,Y3,r,p,q,podkor;

h1=(b-a)/m1;

x1=a;

D1=countD(x1);

if (D1<0)

h1=-h1;

x2=x1+h1;

D2=countD(x2);

Y1=countF(x1);

Y2=countF(x2);

do

{

z1=x1-x2;

r=D2;

p=(D1-D2-2*(Y1-Y2-D2*z1)/z1)/(z1*z1);

q=(D2-D1+3*(Y1-Y2-D2*z1)/z1)/z1;

podkor=q*q-3*p*r;

if (podkor<0)

zm=-q/(3*p);

else

zm=(-q+sqrt(podkor))/(3*p);

x1=x2;

Y1=Y2;

D1=D2;

x2=x2+zm;

Y2=countF(x2);

D2=countD(x2);

}

while(fabs(zm)>e);

x3=x2+zm;

Y3=countF(x3);

return x3;

}
int _tmain(int argc, _TCHAR* argv[])

{

int ans;

double a1=4,b1=20,m=20,x,y,h1,a2,rez,b2,e1=0.0001;

h1=(b1-a1)/m;

x=a1;

cout<<"x \t y"<<endl;

while(x<b1+0.1)

{

y=countF(x);

cout<<x<<"\t"<<y<<endl;

x=x+h1;

}

do

{

cout<<"Enter a:"<<endl;

cin>>a2;

cout<<"Enter b:"<<endl;

cin>>b2;

rez=MP3(a2,b2,e1);

cout<<"Minimum is: "<<rez<<endl;

ans=1;

cout<<"Find more minimums? "<<endl<<"'1'-YES"<<endl<<"'0'-NO"<<endl;

cin>>ans;

}

while(ans!=0);

return 0;

}


Рис. 5.1
^

6. Решение задачи Коши для обыкновенных дифференциальных уравнений


Варианты заданий

Составить программу для решения задачи Коши.

Решить задачу для системы двух уравнений в соответствии с вариантом (табл. 7.1):



Точное решение этой задачи при одинаково для всех вариантови имеет вид: .

Начальные условия следует задать: y[1]:=2a; y[2]:=exp(a);.

Сравнивая полученное решение с точным решением, добиваться того, чтобы погрешность на втором конце (x=b) была не больше 0.0001.

N





[a, b]

U1(a)

u2(a)

ме-тод

5





[2,4]

4



M5


Программа для решения задачи Коши приведена в листинге 6.1.

Результаты работы программы приведены на рис. 6.1.

Листинг 6.1

// Ganisevsky6_M5.cpp : Defines the entry point for the console application.

//
#include "stdafx.h"

#include <iostream>

#include <math.h>

#include <iomanip>
using namespace std;
void OUT(double x,double y21,double y22)

{

double u[2]={(2*2),pow(2.718,2)};

cout << x << fixed <<setprecision(3)<< "\t"<< y21 << "\t" << 2*2 << "\t"<<fabs(y21-2*2)<< "\t" << y22 << "\t" << exp(2.0) << "\t"<<fabs(y22-exp(2.0))<<endl;

}
double FPR1(double x1, double y11, double y12)

{

return 2*y11+(y12+pow(2.718,x1))/pow(2.718,x1)-4*x1;

}

double FPR2(double x2, double y211, double y212)

{

return 2*x2*y212/y211;

}

int main()

{

int i,n;

double h,x,eps,ny,a=2,b=4,nx,np;

double y[3];

double yp[3];

double ypp[3];

double yppp[3];

double yx[3];

double f[3];

double fp[3];

double fpp[3];

double fppp[3];

np=0;

ny=2;

nx=20;

y[1]=4;

y[2]=exp(2.0);

eps=0.0001;

do

{

h=(b-a)/nx;

x=a;

if(np!=0)

{

cout << "x " <<"\ty1 " << "\tu1 " << "\tD1 "<<"\ty2" << "\tu2 " << "\tD2 "<<endl;

OUT(x,y[1],y[2]);

}

else

{

np=nx+1;

}

for(n=1;n<=nx;n++)

{

f[1]=FPR1(x,y[1],y[2]);

f[2]=FPR2(x,y[1],y[2]);

for(i=1;i<=ny;i++)

{

yp[i]=y[i]+(h/2)*f[i];

}

x=x+h/2;

fp[1]=FPR1(x,yp[1],yp[2]);

fp[2]=FPR2(x,yp[1],yp[2]);

for(i=1;i<=ny;i++)

{

ypp[i]=yp[i]+(h/2)*f[i];

}

x=x+h/2;

fpp[1]=FPR1(x,ypp[1],ypp[2]);

fpp[2]=FPR2(x,ypp[1],ypp[2]);

for(i=1;i<=ny;i++)

{

yppp[i]=ypp[i]+h*f[i];

}

x=x+h/2;

fppp[1]=FPR1(x,yppp[1],yppp[2]);

fppp[2]=FPR2(x,yppp[1],yppp[2]);

for(i=1;i<=ny;i++)

{

yx[i]=yppp[i]+(h/6)*(f[i]+2*fp[i]+2*fpp[i]+fppp[i]);

}

if(fmod(n,np)==0)

{

cout << "x " <<"\ty1 " << "\tu1 " << "\tD1 "<<"\ty2" << "\tu2 " << "\tD2 "<<endl;

OUT(x,yx[1],yx[2]);

}

}

nx=nx*2;

}

while(h>eps);

return 0;

}



Рис. 6.1







Скачать файл (282.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации