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

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

18