Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
098270_B48CC_kontrolnaya_rabota.doc
Скачиваний:
14
Добавлен:
17.09.2019
Размер:
289.28 Кб
Скачать

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