Реферат: Поиск максимума одной функции многих переменных методом покоординатного спуска и с помощью метода дихотомии

Реферат

В работе реализуетсянахождение решения одной задачи на тему максимизации функций многих переменных.При этом рассматриваются методы дихотомии и покоординатного спуска.

Пояснительная записка ккурсовой работе состоит из двух основных частей: теоретической и практической.

В теоретической части рассматриваетсяпоиск максимума одной функции многих переменных методом покоординатного спускаи с помощью метода дихотомии.

Практическая частьсодержит разработку программного обеспечения для решения заданной задачи вышеуказанными методами, реализованную на языке С++.

Объем пояснительнойзаписки: 1

Количество рисунков: 3

Количество используемыхисточников: 3


Содержание

Введение

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

2. Решение задачи с использованиемметода дихотомии

2.1 Описание метода дихотомии

2.2 Алгоритм решения

3. Решение задачи с использованиемметода покоординатного спуска

3.1 Описание метода покоординатногоспуска

3.2 Алгоритм решения

Заключение

Список используемой литературы

Приложение 1. Листинг программы№1

Приложение 2. Листинг программы №2

Приложение 3. Листинг программы №3

Приложение 4. Результаты работыпрограммы №1

Приложение 5. Результаты работыпрограммы №3


Введение

В работе рассмотреныспособы нахождения таких значений аргументов, при которых исходная функциямаксимальна, а вспомогательная (от которой зависит исходная) – минимальна. Впараграфе 2 изложено решение задачи с использованием метода дихотомии. Впараграфе 3 произведено исследование задачи методом покоординатного спуска.


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

Исходная функция имеетвид:

/>, где:

xi/>R –– параметры исходной функции;

p, q/>R –– некоторые параметры удовлетворяющие условию 1<p/>q<∞;

с=c(x1…xn) ––вспомогательная функция, записанная в неявном виде

/>→min.

Задача:

Найти xi*, />: f(x1*…xn*)=/>f(x1…xn).

Выполним следующуюзамену: xi=axi+b, />. При этомзначение функции не изменится:

/> 

/>

Таким образом, исходнуюобласть определения функции можно сузить до xi/>R[0;1]. Так как знаменатель не должен бытьравным нулю, то xi≠xj/>i≠j. Но тогда все параметры можно расположить по возрастанию: x1/>x2/>…/>xi/>xi+1/>…/>xn, а выбором a и b можно привести x1=0, xn=1.

Далее будем рассматриватьзадачу от n-2 переменных, т.к. x1 и xn<sub/>являются константами.


2. Решениезадачи с использованием метода дихотомии

 

2.1 Описаниеметода дихотомии

Данный метод применяетсядля решения нелинейных уравнений. Если нелинейное уравнение достаточно сложное,то найти точно его корни удается весьма редко. Важное значение приобретаютспособы приближенного нахождения корней уравнения и оценка степени их точности.

Пусть f(x)=0      (1)

Где f(x)определена и непрерывна в некотором конечном ибесконечном интервале a<x<b. Требуется найти все или некоторые корни уравнения (1).Всякое значение />, обращающее функцию f(x)в нуль, называется корнем уравнения (1). Поставленнаязадача распадается на несколько этапов:

1.      Отделениекорней, т.е. установление возможно более тесных промежутков [/>,/>], в которыхсодержится только по одному корню.

2.  Нахождениеприближенных (грубых) значений корней.

3.  Вычисление корнейс требуемой точностью.

Первая ивторая задача решаются аналитическими и графическими методами.

Отделениекорней

Еслиуравнение f(x)= 0 имеет только действительные корни, то полезносоставить таблицу значений функции f(x).Если в двух соседних точках /> и /> функцияимеет разные знаки, то между этими точками лежит по меньшей мере один корень.Корень будет заведомо единственным, если /> определенана отрезке [/>,/>]и сохраняетпостоянный знак.


Графическиеметоды

Действительныекорни уравнения f(x)= 0 приближенно можноопределить как абсциссы точек пересечения графика функции f(x)с осью x.

Приближенныезначения корней, найденные грубо, в дальнейшем уточняют с помощью какого-либоитерационного метода.

Методдихотомии

Дихотомияозначает деление пополам. Пусть нашли такие точки /> и />,что /> < 0, т.е. на [/>,/>] лежит по меньшей мереодин корень. Найдем середину отрезка [/>,/>]. Получаем />. Если f(x2) = 0, то /> еслиf(/>)/>0, то из двух половинотрезка выберем ту, для которой выполняется условие /> <0, т.к. корень лежит на этой половине. Затем вновь делим выбранный отрезокпополам и выбираем ту половину, на концах которой функция имеет разные знаки.

Еслитребуется найти корень с точностью />, топродолжим деление пополам (если конечно функция в середине какого-либо отрезкане обращается в нуль), пока длина очередного отрезка не станет < 2/>. Тогда серединапоследующего отрезка установит значение с требуемой точностью. Метод дихотомиипрост и очень надежен. Он сходится для любых непрерывных функций f(x), в том числе не дифференцируемых.

Методустойчив к ошибкам округления, но скорость сходимости невелика. К недостаткамметода следует отнести сходимость к неизвестно какому корню (если корни неотделены). Но указанный недостаток имеется у всех итерационных методов.Дихотомия применяется тогда, когда требуется высокая надежность счета, аскорость сходимости малосущественна. Метод иногда применяется для грубогонахождения корней с последующим уточнением по другому методу с большейскоростью сходимости.

Этотметод относится к двусторонним (или к двух шаговым) методам, т.к. длявычисления очередного приближения необходимо знать два предыдущих.

2.2     Алгоритмрешения

Для нахождения максимумафункции будем перебирать всевозможные переменные xi, />,с шагом необходимой длины.

Затем будем находитьзначение функции с(/>) методомдихотомии.

Для этого вычислимпроизводную функции />, зависящей от с,и приравняем ее к 0.

/>

/>

Найдем корень /> этого нелинейногоуравнения методом дихотомии.

Подставим конкретныйнабор /> и при нем найденное /> в исходную функцию, иполучим ее значение.

Перебирая все xi, найдем максимум функции.

Перебирая всевозможныепараметры p и q, получим некоторые наборы />(взависимости от p и q) на которых функция достигает максимума.


3. Решениезадачи с использованием метода покоординатного спуска

 

3.1 Описаниеметода покоординатного спуска

Изложим этотметод на примере функции трех переменных />.

Выберемнулевое приближение />. Фиксируемзначения двух координат />. Тогдафункция будет зависеть только от одной переменной />;обозначим ее через />. Найдем минимумфункции одной переменной /> иобозначим его через />. Мы сделали шагиз точки /> в точку /> по направлению,параллельному оси />; на этом шагезначение функции уменьшилось.

Затем изновой точки сделаем спуск по направлению, параллельному оси />, т. е. рассмотрим />, найдем ее минимум иобозначим его через />. Второй шагприводит нас в точку />. Из этой точкиделаем третий шаг – спуск параллельно оси /> инаходим минимум функции />.Приход в точку /> завершает циклспусков.

Будемповторять циклы. На каждом спуске функция не возрастает, и при этом значенияфункции ограничены снизу ее значением в минимуме />.Следовательно, итерации сходятся к некоторому пределу />. Будет ли здесь иметьместо равенство, т. е. сойдутся ли спуски к минимуму и как быстро?

Это зависитот функции и выбора нулевого приближения.

Метод спускапо координатам несложен и легко программируется на ЭВМ. Но сходится онмедленно. Поэтому его используют в качестве первой попытки при нахождении минимума.


3.2 Алгоритмрешения

Будем перебирать сс шагом какой-либо малой длины.

Зададим нулевоеприближение, например:

/>

Найдем частныепроизводные />.

/>

Пусть при каком-то j />

Тогда k-ое приближение считаем по формулам:

/>

Шаг t будем выбирать таким образом, чтобы

/> и />.

В результате, закончивпроцесс по критерию />/> />, где />-заданная точность мыпридем к набору/>, при которомфункция f максимальна.

Подставим найденный набор/> и соответствующее /> в функцию f1=/>иперебрав все с, выберем те />, прикоторых f1 минимальна.


Заключение

В ходе решенияпоставленной задачи рассмотрены случаи, когда n=4,5,6. Были найдены две основные области наборов />:

1) xi=0 или 1(количество 0 и 1 одинаково)

2) xi=0.5, />.

Причем участок 1<p<1.5 покрыт первой областью, при q>>p /> –– из первой области, при q≈p /> –– из второй области, а при p→∞ область делилась междуними примерно пополам.

На участке p>2 появлялись области вида:

i<k => xi=0;

i>n-k =>xi=1;

k-1<i<n-k+1=>xi=0.5.

На участке 2<q<3 p/>2 существует область, в котороймаксимум достигается при /> вида:

xi=a => xn-i=1-a, 0<a<1.


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

1.        Амосов А.А.,Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров. М.: Высшаяшкола, 1994. 543с.

2.        Березин И.С. иЖидков Н. П. Методы вычислений. т.1. М.: “Наука”, 1965. 633c.

3.        Подбельский В.В.и Фомин С.С. Программирование на языке Си. М.: “Финансы и статистика”, 2000.599с.


Приложение1. Листинг программы №1

//вывод на экран областеймаксимума функции

#include«stdafx.h»

#include«KE2.h»

#include«math.h»

#include«KE2Doc.h»

#include«KE2View.h»

#ifdef _DEBUG

#define newDEBUG_NEW

#undefTHIS_FILE

static charTHIS_FILE[] = __FILE__;

#endif

IMPLEMENT_DYNCREATE(CKE2View,CView)

BEGIN_MESSAGE_MAP(CKE2View,CView)

         //{{AFX_MSG_MAP(CKE2View)

                   //NOTE — the ClassWizard will add and remove mapping macros here.

                   //DO NOT EDIT what you see in these blocks of generated code!

         //}}AFX_MSG_MAP

         //Standard printing commands

         ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)

         ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)

         ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)

END_MESSAGE_MAP()

CKE2View::CKE2View()

{

}

CKE2View::~CKE2View()

{

}

BOOLCKE2View::PreCreateWindow(CREATESTRUCT& cs)

{

         returnCView::PreCreateWindow(cs);

}

voidCKE2View::OnDraw(CDC* pDC)

{

         CKE2Doc*pDoc = GetDocument();

         ASSERT_VALID(pDoc);

         drawPoint(pDC);

         //TODO: add draw code for native data here

}

BOOLCKE2View::OnPreparePrinting(CPrintInfo* pInfo)

{

         //default preparation

         returnDoPreparePrinting(pInfo);

}

voidCKE2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

         //TODO: add extra initialization before printing

}

voidCKE2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

         //TODO: add cleanup after printing

}

#ifdef _DEBUG

voidCKE2View::AssertValid() const

{

         CView::AssertValid();

}

voidCKE2View::Dump(CDumpContext& dc) const

{

         CView::Dump(dc);

}

CKE2Doc*CKE2View::GetDocument() // non-debug version is inline

{

         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CKE2Doc)));

         return(CKE2Doc*)m_pDocument;

}

#endif//_DEBUG

int sgn(floata)

{

int sg;

if (a>0)sg=1;

if (a==0)sg=0;

if (a<0)sg=-1;

return(sg);

}

#define n 6

voidCKE2View::drawPoint(CDC *pDC)

{

          double**c,*f1,*f,*x,*w,*e,max,p=2,q=2,xx,yy;

 inti=0,j=0,k,m,a,b,*l,bb=0;

 c=newdouble*[10000];

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

 {

 c[i]=newdouble[3];

 memset(c[i],0,sizeof(double)*3);

 }

 f=newdouble[10000];

 e=newdouble[10000];

 w=newdouble[10000];

 f1=newdouble[10000];

 x=newdouble[n];

 l=newint[10000];

 

 for(xx=0.5;xx<1;xx+=0.01)

         for(yy=xx;yy<1);yy+=0.01)

         {

p=1./(1.-xx);

q=1./(1.-yy);

memset(w,0,sizeof(double)*10000);

memset(e,0,sizeof(double)*10000);

memset(f1,0,sizeof(double)*10000);

memset(x,0,sizeof(double)*n);

 x[n-1]=1;

 j=0;

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

 {j=0;

 f1[i]=1;c[i][0]=0;c[i][1]=1;c[i][2]=0.5;

 while(fabs(f1[i])>0.00000001)

 {

         f1[i]=0;

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

 {f1[i]+=pow((fabs(x[k]-c[i][2])),(p-1))*sgn(x[k]-c[i][2]);}

 if(f1[i]<-0.00000001)

         {max=c[i][2];c[i][2]=c[i][2]-(fabs(c[i][2]-c[i][1])/2.0);c[i][1]=max;}

 if(f1[i]>0.00000001)

         {max=c[i][2];c[i][2]=c[i][2]+(fabs(c[i][2]-c[i][1])/2.0);c[i][1]=max;}

 if(fabs(f1[i])<=0.00000001)

 {c[i][0]=c[i][2];gotoB;}

 

 }

B:

 c[i][0]=c[i][2];

 for(a=0;a<n;a++)

 {

 

 for(b=0;b<n;b++)

 w[i]+=pow((fabs(x[a]-x[b])),q);

 e[i]+=pow((fabs(x[a]-c[i][0])),p);

 }

 f[i]=pow((e[i]/n),(1./p))/pow((w[i]/(n*n)),(1./q));

 x[n-2]+=0.1;

 for(k=2;k<n;k++)

 {

 if(x[n-k]>1.04)

 {

 x[n-k-1]+=0.1;

 x[n-k]=x[n-k-1];

 for(m=2;m<k;m++)

 x[n-m]=x[n-k-1];

 }

 if (x[0]!=0)goto A;

 }

 

 }

A:

max=f[0];k=0;

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

{

if(fabs(max-f[m])<0.001) {k++;l[k]=m;}

if(max<f[m]) {k=0;max=f[m];l[k]=m;}

}

for(a=0;a<n-1;a++)

         x[a]=0;


for(a=0;a<l[0];a++)

{

         x[n-2]+=0.1;

 for(k=2;k<n;k++)

 if(x[n-k]>1.04)

 {

 x[n-k-1]+=0.1;

 x[n-k]=x[n-k-1];

 for(m=2;m<k;m++)

 x[n-m]=x[n-k-1];

 }

}

 

b=0;

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

         {

         if((x[k]==0)||(fabs(x[k]-1)<0.04))b++;

         else

         {

                   if(fabs(x[k]-0.5)<0.04)b+=2;

                   elseb=-n;

         }

         }

b-=n;

if (b<0)b=24;

if (b==0)b=58;

if(b==bb)continue;

bb=b;

c=%f\n",p,q,l[0],l[k],k+1,max,c[l[0]][0]);

COLORREFcr(RGB((b%3)*127,(b%4)*85,(b%5)*63));

CBrush r(cr);

CPenrp(PS_SOLID,0,cr);

pDC->SelectObject(&rp);

pDC->SelectObject(&r);

CPointr1[3]={CPoint(0,360),CPoint(int(720./p),-int(720./q)+360),CPoint(int(720./p),360)};

pDC->Polygon(r1,3);

         }

}

Приложение 2. Листингпрограммы №2.

//Покоординатный спуск

#include<stdAfx.h>

#include<stdio.h>

#include<iostream.h>

#include<conio.h>

#include<math.h>

#define n 4

void main()

{

         //doubleff(double v,double vv);

         intsgn(float a);

         double*aa,**x,*f1,f,e,w,w1,e1,q=7,p=7,*r,*z,f2,*r1,max,m=0,c,f20,f21;

         intbb,i,MAX,k,j,a,b,mm,ss;

         x=newdouble*[n];

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

                   x[i]=newdouble[2];

         z=newdouble[3];

         aa=newdouble[n-2];

         r=newdouble[n];

         r1=newdouble[n];

         //f2=newdouble[n];

         f1=new double[n];

        

         for(i=1;i<n-1;i++)//начальное прибл — все х от 1-го до n-2-го равны

                   x[i][0]=0.1;//

         x[n-1][0]=1;x[n-1][1]=1;x[0][1]=0;x[0][0]=0;x[1][0]=0.9;//x[2][0]=0;//x[3][0]=0;x[4][0]=1;//начальноеприближение

        

         for(c=0.5;c<0.7;c+=0.1)//Цикл по c        

         {       

                   bb=0;

                   for(k=1;;k++)//Цикл по k

                   {

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

                   //                 cerr<<«x[»<<i<<"]="<<x[i][0]<<"\n";

                   //       cerr<<"\n";

                            w=0;e=0;w1=0;e1=0;

                            for(a=0;a<n;a++)

                                      r[a]=0;

                            for(a=0;a<n;a++)

                            {

                                      for(b=0;b<n;b++)

                                      {

                                               w+=pow((fabs(x[a][0]-x[b][0])),q);

                                               r[a]+=pow((fabs(x[a][0]-x[b][0])),q-1)*sgn(x[a][0]-x[b][0]);

                                      }

                                      e+=pow((fabs(x[a][0]-c)),p);

                            }       

                            w=pow(w/(n*n),1./q);//знаменательисх ф-ции

                            e=pow(e/n,1./p);//числительисх ф-ции

 f=e/w;

                            //cerr<<"\n"<<f<<"\n";

                            f1[0]=0;f1[n-1]=0;

                            MAX=0;

                    for(j=1;j<n-1;j++)

                            {

                                      f1[j]=pow(n,(2./q-1./p))*(pow(e,(1./p-1))*pow(fabs(x[j][0]-c),(p-1))*w

                                      *sgn(x[j][0]-c)-2.*pow(w,(1./q-1))*r[j])/(w*w);//производная исх. функции по x[j][0] в точке с координатами x[i][0] i=0..n-1на k-ом приближении

                   //       cerr<<f1[j]<<"\n";

                                      for(a=0;a<bb;a++)

                                               if(aa[a]==j)break;

                                      if(a!=bb)continue;

                             if(fabs(f1[j])>fabs(f1[MAX])) MAX=j;

                            }

                            //т.к. x[0]=0 и x[n-1]=1 — cosnt

 mm=0;ss=0;

                            for(i=0;;i++)

                            {

                                      if(mm==0) z[0]=100000000./pow(1.2,i);//шаг

                                      if(mm==1) 

                                      {

                                               z[0]=-1000000000./pow(1.2,ss);

                                               ss++;

                                      }

                                      /*if(z[0]<0.000000000000001)

                                      {

                                               z[0]=-0.5/pow(1.5,mm);

                                       mm++;

                                      }*/

                                      for(a=0;a<n;a++)

                                               r1[a]=0;

                                      w1=0;e1=0;

                                      for(a=0;a<n;a++)

                                      {

                                               if(a==MAX)

                                               {

                                                        for(b=0;b<n;b++)

                                                        {

                                                                  w1+=pow(fabs(x[a][0]+f1[a]*z[0]-(x[b][0]+f1[b]*z[0])),q);

                                                                  r1[a]+=pow(fabs(x[a][0]+f1[a]*z[0] — (x[b][0]+f1[b]*z[0]) ),q-1)*

                                                                  sgn(x[a][0]+f1[a]*z[0] — (f1[b]*z[0]+x[b][0]) );

                                                        }

                                                        e1+=pow((fabs(x[a][0]+f1[a]*z[0]-c)),p);

 }                                  

                                               else

                                               {

                                                        for(b=0;b<n;b++)

                                                        {

                                                                  w1+=pow((fabs(x[a][0]-x[b][0])),q);

                                                                  r1[a]+=pow((fabs(x[a][0]-x[b][0])),q-1)*sgn(x[a][0]-x[b][0]);

                                                        }

                                                        e1+=pow((fabs(x[a][0]-c)),p);

                                               }       

                                      }

                                      w1=pow(w1/(n*n),1/q);e1=pow(e1/n,1/p);

                                      //printf("\nf=%f f[a]=%f",e/w,e1/w1);

                                      a=0;

                                      //for(j=1;j<n-1;j++)

                                      //if     (((x[j][0]+z[0]*f1[j])<1)&&((x[j][0]+z[0]*f1[j])>0))a++;

                                      //if(a<n-2)continue;

                                      if         (((x[MAX][0]+z[0]*f1[MAX])<1)&&((x[MAX][0]+z[0]*f1[MAX])>0))a++;

                                      if(a!=1)continue;

                                      if(e1/w1>e/w)      break;

                                      if((e1/w1-e/w)>-0.00000001)

                                      {

                                               if(z[0]>0)

                                               {

                                                        mm=1;

                    continue;

                                               }

                                               for(a=1;a<n-1;a++)

                                               x[a][1]=x[a][0];

                                               gotoA;

                                      }

                            }

        

                            for(j=1;j<n-1;j++)

                                      if(j==MAX)x[j][1]=x[j][0]+z[0]*f1[j];

                                      else   x[j][1]=x[j][0];

 if(fabs(x[MAX][1]-x[MAX][0])<0.00000001)

                            {

                                      aa[bb]=MAX;

                                      bb++;

                            }

                            if(bb==n-2)break;

                            for(j=1;j<n-1;j++)

                                      x[j][0]=x[j][1];

                   } //закрытие цикла по k

                   A:

                   cerr<<«K-voiteratsiy: „<<k-1<<“\n\n»;

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

                            cerr<<«x[»<<i<<"]="<<x[i][0]<<"\n";

                            cerr<<"\nf="<<f<<"\n";

         }// закрытиецикла по с

}

int sgn(floata)

{

         intsg;

         if(a>0) sg=1;

         if(a==0) sg=0;

         if(a<0) sg=-1;

         return(sg);

}


Приложение3. Листинг программы №3

#include <stdAfx.h>

#include<stdlib.h>

#include<stdio.h>

#include<conio.h>

#include<math.h>

#include<iostream.h>

#define n 4

intsgn(float);

main()

{

 double**c,*f1,*f,*x,*w,*e,max,p=2,q=2,xx,yy;

 inti=0,j=0,k,m,a,b,*l;

 

 c=newdouble*[10000];

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

 c[i]=newdouble[4];

 f=newdouble[10000];

 e=newdouble[10000];

 w=newdouble[10000];

 f1=newdouble[10000];

 x=newdouble[n];

 l=newint[10000];

 

 for(xx=0.5;xx<1;xx+=0.01)

         for(yy=xx;yy<1;yy+=0.01)

         {

p=1./(1.-xx);

q=1./(1.-yy);

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

 {

          w[i]=0;

          e[i]=0;

          f1[i]=0;

 }

 

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

 for(j=0;j<3;j++)

 {c[i][j]=0;

 }

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

 x[i]=0;

 x[n-1]=1;

 j=0;

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

 {j=0;

 f1[i]=1;c[i][0]=0;c[i][1]=1;c[i][2]=0.5;

 while(fabs(f1[i])>0.000000001)

 {

         f1[i]=0;

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

 {f1[i]+=pow((fabs(x[k]-c[i][2])),(p-1))*sgn(x[k]-c[i][2]);}

 if(f1[i]<-0.000000001)

         {max=c[i][2];c[i][2]=c[i][2]-(fabs(c[i][2]-c[i][1])/2.0);c[i][1]=max;}

 if(f1[i]>0.000000001)

         {max=c[i][2];c[i][2]=c[i][2]+(fabs(c[i][2]-c[i][1])/2.0);c[i][1]=max;}

 if(fabs(f1[i])<=0.000000001)

 {c[i][0]=c[i][2];gotoB;}

 

 }

B:

 c[i][0]=c[i][2];

 for(a=0;a<n;a++)

 {

 

 for(b=0;b<n;b++)

 w[i]+=pow((fabs(x[a]-x[b])),q);

 e[i]+=pow((fabs(x[a]-c[i][0])),p);

 }

 f[i]=pow((e[i]/n),(1./p))/pow((w[i]/(n*n)),(1./q));

 x[n-2]+=0.1;

 for(k=2;k<n;k++)

 {

 if(x[n-k]>1.04)

 {

 x[n-k-1]+=0.1;

 x[n-k]=x[n-k-1];

 for(m=2;m<k;m++)

 x[n-m]=x[n-k-1];

 }

 if (x[0]!=0)goto A;

 }

 

 }

A:

max=f[0];k=0;

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

{

if(fabs(max-f[m])<0.0001) {k++;l[k]=m;}

if(max<f[m]) {k=0;max=f[m];l[k]=m;}

}

printf(«p=%fq=%f max=%f\n»,p,q,max);

x[n-1]=1;

for(a=0;a<=n-2;a++)

         x[a]=0;

for(a=0;a<l[0];a++)

         {

         x[n-2]+=0.1;

 for(k=2;k<n;k++)

 {

 if(x[n-k]>1.04)

 {

 x[n-k-1]+=0.1;

 x[n-k]=x[n-k-1];

 for(m=2;m<k;m++)

 x[n-m]=x[n-k-1];

 }

 }

}

for(a=0;a<n;a++)

printf(«Nabor:x[%d]=%f»,a,x[a]);

         }

 getch();

 return 0;

}

int sgn(floata)

{

int sg;

if (a>0)sg=1;

if (a==0)sg=0;

if (a<0)sg=-1;

return(sg);

}


Приложение№4 Результаты работы программы №1:

n=6

/>

/>

/>

/>

/>

n=5

/>


n=4

/>

 

Приложение№5. Результаты работы программы №3.

p=2.000000 q=2.000000 max=0.707107

Nabor:x[0]=0.000000 x[1]=0.600000 x[2]=0.700000 x[3]=1.000000

p=2.000000 q=2.100000max=0.696478

Nabor:x[0]=0.000000 x[1]=0.300000 x[2]=0.700000 x[3]=1.000000

p=2.000000 q=2.200000max=0.686567

Nabor:x[0]=0.000000 x[1]=0.300000 x[2]=0.700000 x[3]=1.000000

p=2.000000 q=2.300000max=0.677294

Nabor:x[0]=0.000000 x[1]=0.300000 x[2]=0.700000 x[3]=1.000000

p=2.000000 q=2.400000max=0.668738

Nabor:x[0]=0.000000 x[1]=0.200000 x[2]=0.800000 x[3]=1.000000

 p=2.000000 q=2.500000max=0.660879

Nabor:x[0]=0.000000 x[1]=0.200000 x[2]=0.800000 x[3]=1.000000

p=2.000000 q=2.600000max=0.653565

Nabor:x[0]=0.000000 x[1]=0.200000 x[2]=0.800000 x[3]=1.000000

p=2.000000 q=2.700000max=0.646741

Nabor: x[0]=0.000000x[1]=0.200000 x[2]=0.800000 x[3]=1.000000

p=2.000000 q=2.800000max=0.640603

Nabor:x[0]=0.000000 x[1]=0.100000 x[2]=0.900000 x[3]=1.000000

p=2.000000 q=2.900000max=0.635019

Nabor:x[0]=0.000000 x[1]=0.100000 x[2]=0.900000 x[3]=1.000000

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