Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 17:57   #1
SL1M_DOGG
Пользователь
 
Регистрация: 08.06.2009
Сообщений: 96
По умолчанию Необходимо изменить задачу в C++

Здравствуйте. Собственно есть программа, которая минимизирует модель методом сопряженных направлений Пауэлла.
Код:
Код:
#include <iostream.h> //Метод сопряженных направлений
#include <math.h>
#include <conio.h>

double f(double  x1,double x2) {
    return 4*(x1-5)*(x1-5)+(x2-6)*(x2-6);}
int main(){
    double E=0.1, min, var[200], t;
    int i, j, n=2, k=0;
    int s=0, I[100];

    double d[3][3]={{0,1}, {1,0}, {0,1}};    cout <<d[0][0]<<" "<<d[0][1]<<" "<<
						    d[1][0]<<" "<<d[1][1]<<" "<<
						    d[2][0]<<" "<<d[2][1]<<endl;
    double X[20][20], Y[20][40], Xz[1][2];
    I[s]=0;
    cout <<"X0:"<<endl;           //задаем начальную точку Хо
    for(i=0;i<1;i++)
      for(int j=0;j<2;j++)
	cin >>X[i][j];           cout <<"X("<<X[0][0]<<";"<<X[0][1]<<")\n";
      for(i=0;i<1;i++)             //Y0 = Xo
      for(j=0;j<2;j++)
	Y[i][j]=X[i][j];         cout <<"Y("<<Y[0][0]<<";"<<Y[0][1]<<")\n";
//.2.........................
TWO:  cout <<" __2__"<<endl;
      min=f(Y[I[s]][0],Y[I[s]][1]);
      i=0;
      for(t=-50;t<50;t++,i++)    //вывод различных значений ф-ции
	{
	  var[i]=f( Y[I[s]][0]+t*d[I[s]][0], Y[I[s]][1]+t*d[I[s]][1]);
	  cout <<"var ["<<i<<"] = "<<var[i]<<endl;
	}
      for(i=0;i<100;i++)      //вывод наименьшего значения ф-ции
	  if(var[i] < min)
	    min = var[i];
	    cout <<"min var[] = "<<min<<endl;
      for(int index=0;index<100;index++)  //вывод t
        { 
          if( min==var[index] )
          t=index-50;
        }
      cout <<"T = "<<t<<endl;
      Y[I[s]+1][0] = Y[I[s]][0] + t*d[I[s]][0];
      Y[I[s]+1][1] = Y[I[s]][1] + t*d[I[s]][1];  
                                           cout <<"Y["<<I[s]+1<<"] = ("<<Y[I[s]+1][0]<<";";
                                           cout <<Y[I[s]+1][1]<<")"<<endl;
//.3.................
THREE:  cout <<" __3__"<<endl;  
        if(I[s] < n-1)
        {
            cout <<"I[s] < n-1"<<endl;    
            I[s]=I[s]+1;
            cout <<"I[s] = "<<I[s]<<endl;
            goto TWO;    
        }   //*/
        if(I[s] == n-1)
        {   
            cout <<"I[s] == n-1"<<endl;
            if( (Y[n][0]==Y[0][0]) && (Y[n][1]==Y[0][1]) ){
               Xz[0][0]=Y[n][0];        cout <<"Xz("<<Xz[0][0]<<";";
               Xz[0][1]=Y[n][1];        cout <<Xz[0][1]<<")"<<endl;
            }
            else {
            cout <<"Yn != Y0 "<<endl;
            I[s]=I[s]+1;
             cout <<"I[s] = "<<I[s]<<endl;
            goto TWO; }  
        }
        if(I[s] == n)
        {
            cout <<"I[s]  == n"<<endl;    
            if( (Y[n+1][0]==Y[1][0]) && (Y[n+1][1]==Y[1][1]) ){
               Xz[0][0]=Y[n+1][0];        cout <<"Xz("<<Xz[0][0]<<";";
               Xz[0][1]=Y[n+1][1];        cout <<Xz[0][1]<<")"<<endl;
            }
            if( (Y[n+1][0]!=Y[1][0]) || (Y[n+1][1]!=Y[1][1]) ){
            goto Fourth; 
            }
        }
//.4.........................        
Fourth:  cout <<" __4__"<<endl;  
         X[k+1][0]=Y[n+1][0];    cout <<"X["<<(k+1)<<"] = ("<<X[k+1][0];
         X[k+1][1]=Y[n+1][1];    cout <<";"<<X[k+1][1]<<")"<<endl; 
//...........a...............
         if( pow( ( pow((X[k+1][0]-X[k][0]),2)+pow((X[k+1][1]-X[k][1]),2) ),1/2.0)<E ){
         cout <<"X(k+1) - X(k) = "<<pow( ( pow((X[k+1][0]-X[k+1][0]),2)+
                                    pow((X[k+1][1]-X[k+1][1]),2) ),1/2.0);
             Xz[0][0]=X[k+1][0];
             Xz[0][1]=X[k+1][1];    
         }
//..................b.....................
         if( pow( ( pow((X[k+1][0]-X[k][0]),2)+pow((X[k+1][1]-X[k][1]),2) ),1/2.0)>E ){
         d[0][0]=d[n][0]=Y[n+1][0]-Y[1][0];    cout <<"d0 = ("<<d[0][0];
             d[0][1]=d[n][1]=Y[n+1][1]-Y[1][1];    cout <<";"<<d[0][1]<<")"<<endl;
             
             d[I[s]][0]=d[I[s]+1][0];
             d[I[s]][1]=d[I[s]+1][1];
             if( (d[1][0]*d[2][1]-d[1][1]*d[2][0]) != 0){
                cout <<"rang(D1,...,Dn) = n"<<endl;
                Y[0][0]=X[k+1][0];  cout <<"Y0 = ("<<Y[0][0]<<";";
                Y[0][1]=X[k+1][1];  cout <<Y[0][1]<<")\n";
                k=k+1;
                I[s]=0;
                goto TWO;                                    }  
             if( (d[1][0]*d[2][1]-d[1][1]*d[2][0]) == n){
                cout <<"rang(D1,...,Dn) < n"<<endl;
                Y[0][0]=X[k+1][0];
                Y[0][1]=X[k+1][1];
                k=k+1; I[s]=0;
goto TWO;                                      
             } 
         }   
 cout <<"\nXz("<<Xz[0][0]<<";"<<Xz[0][1]<<")"<<endl;    
     getch();}
Она минимизирует функцию 4((x1-5)^2)+(x2-6)^2. В моем случае нужно минимизировать функцию (9*х1*x1)+(35*х2*x2)+(32*х1*х2)–(88 *х1)–(176*х2)+242, пытался заменить функцию в строке
Код:
return 4*(x1-5)*(x1-5)+(x2-6)*(x2-6);}
но выдает или неверный результат, или кучу ошибок.
Помогите кто сможет.
P.S.: результат должен быть x1=2.207 x2=1.507
SL1M_DOGG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реестр - Необходимо изменить действие по умолчанию для .reg файлов(«Изменить» вместо «Объединить»). ACE Valery Windows 7 30.11.2010 23:33
Необходимо в теле FOR изменить значение i Des Общие вопросы Delphi 2 06.11.2010 10:51
Необходимо изменить вид отчета alex0173 Microsoft Office Excel 7 22.03.2010 11:40
Стеки (как изменить задачу?) Anita_i Помощь студентам 3 30.11.2009 19:29
Необходимо написать задачу в Transact SQL Student'ochka Помощь студентам 1 24.05.2009 14:05