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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2017, 09:29   #1
toha0074
 
Регистрация: 13.11.2017
Сообщений: 8
По умолчанию Метод золотого сечения

Метод золотого сечения. Помогите понять почему выдает не правильный результат, хотя все по формуле. Вот код:


Код:
#include <vcl.h>
#pragma hdrstop
#include "math.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
const double goldenRatio = 1.613033;
double fy(double x){
double k; k=-exp(-x)*log(x);
return k;};

void __fastcall TForm1::FormActivate(TObject *Sender)
{
double x,y;
Series1->Clear();
for (x=0.01; x<=10; x=x+0.01) { y=fy(x); Series1->AddXY(x,y);}
y=0; x=0;
for (x=-20; x<=20; x=x+0.01) { y=0; Series2->AddXY(x,y);}
y=0; x=0;
for (y=-20; y<=20; y=y+0.01) { x=0; Series3->AddXY(x,y);}
Chart1->Refresh();
Chart1->LeftAxis->Maximum=20;
Chart1->LeftAxis->Minimum=-20;
Chart1->LeftAxis->Increment=(Chart1->LeftAxis->Maximum-Chart1->LeftAxis->Minimum)/20;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
float** tabl = new float *[10];
for (int i = 0; i < 10; i++)
tabl[i] = new float[8];


tabl[0][0]=1;
tabl[0][1]=StrToFloat(Edit1->Text);
tabl[0][2]=StrToFloat(Edit2->Text);
tabl[0][3]=tabl[0][2]-(tabl[0][2]-tabl[0][1])/goldenRatio;
tabl[0][4]=tabl[0][1]+(tabl[0][2]-tabl[0][1])/goldenRatio;
tabl[0][5]=0  ;
tabl[0][6]=0;
tabl[0][7]=0;

for (int w=0; w<8; w++) StringGrid1->Cells[w][1]=FloatToStr(tabl[0][w]);
int i=1;    float t,o;         t=StrToFloat(Edit3->Text);

do{
        tabl[i][0]=i+1;
        tabl[i][3]=tabl[i][2]-(tabl[i][2]-tabl[i][1])/goldenRatio;
        tabl[i][4]=tabl[i][1]+(tabl[i][2]-tabl[i][1])/goldenRatio;



                  if(fy( tabl[i][3])>=fy( tabl[i][3]))
                 {tabl[i][1]=tabl[i][3];
                 tabl[i][2]=tabl[i][4];}
        i++;

} while (fabs(tabl[0][2]-tabl[0][1])<t);



Edit4->Text=FloatToStr((tabl[i][1]+tabl[i][2])/2);
StringGrid1->RowCount=i+1;
for (int q=1; q<i; q++) {for (int w=0; w<8; w++) {StringGrid1->Cells[w][q+1]=FloatToStr(tabl[q][w]);}}

}
//---------------------------------------------------------------------------





void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->Cells[0][0]="Номер итерации";
StringGrid1->Cells[1][0]="A";
StringGrid1->Cells[2][0]="B";
StringGrid1->Cells[3][0]="B-A";
StringGrid1->Cells[4][0]="X1";
StringGrid1->Cells[5][0]="X2";
StringGrid1->Cells[6][0]="F(X1)";
StringGrid1->Cells[7][0]="F(X2)";
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор
Изображения
Тип файла: jpg Безымянный.jpg (89.3 Кб, 142 просмотров)

Последний раз редактировалось Serge_Bliznykov; 22.11.2017 в 09:40.
toha0074 вне форума Ответить с цитированием
Старый 22.11.2017, 09:47   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
 do{
tabl[i][0]=i+1;
tabl[i][3]=tabl[i][2]-(tabl[i][2]-tabl[i][1])/goldenRatio;
tabl[i][4]=tabl[i][1]+(tabl[i][2]-tabl[i][1])/goldenRatio;
где задание(присвоение) tab[i][1] tab[i][2] аналогичное нижеследующему
Цитата:
Код:
tabl[0][0]=1;
tabl[0][1]=StrToFloat(Edit1->Text);
tabl[0][2]=StrToFloat(Edit2->Text);
tabl[0][3]=tabl[0][2]-(tabl[0][2]-tabl[0][1])/goldenRatio;
tabl[0][4]=tabl[0][1]+(tabl[0][2]-tabl[0][1])/goldenRatio;
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 22.11.2017, 10:11   #3
toha0074
 
Регистрация: 13.11.2017
Сообщений: 8
По умолчанию

Присвоил, но ничего от этого не изменилось. Опять неверные результаты
toha0074 вне форума Ответить с цитированием
Старый 22.11.2017, 13:10   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Сообщение от toha0074 Посмотреть сообщение
Присвоил, но ничего от этого не изменилось. Опять неверные результаты
А показать исправленный вариант.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 22.11.2017, 14:16   #5
toha0074
 
Регистрация: 13.11.2017
Сообщений: 8
По умолчанию

Вот, пожалуйста

Код:
#include <vcl.h>
#pragma hdrstop
#include "math.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
const double goldenRatio = 1.613033;
double fy(double x){
double k; k=-exp(-x)*log(x);
return k;};

void __fastcall TForm1::FormActivate(TObject *Sender)
{
double x,y;
Series1->Clear();
for (x=0.01; x<=10; x=x+0.01) { y=fy(x); Series1->AddXY(x,y);}
y=0; x=0;
for (x=-20; x<=20; x=x+0.01) { y=0; Series2->AddXY(x,y);}
y=0; x=0;
for (y=-20; y<=20; y=y+0.01) { x=0; Series3->AddXY(x,y);}
Chart1->Refresh();
Chart1->LeftAxis->Maximum=20;
Chart1->LeftAxis->Minimum=-20;
Chart1->LeftAxis->Increment=(Chart1->LeftAxis->Maximum-Chart1->LeftAxis->Minimum)/20;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
float** tabl = new float *[10];
for (int i = 0; i < 10; i++)
tabl[i] = new float[8];


tabl[0][0]=1;
tabl[0][1]=StrToFloat(Edit1->Text);
tabl[0][2]=StrToFloat(Edit2->Text);
tabl[0][3]=tabl[0][2]-tabl[0][1];
tabl[0][4]=tabl[0][1]+0.382*tabl[0][3];
tabl[0][5]=tabl[0][1]+0.618*tabl[0][3];
tabl[0][6]=fy(tabl[0][4]);
tabl[0][7]=fy(tabl[0][5]);

for (int w=0; w<8; w++) StringGrid1->Cells[w][1]=FloatToStr(tabl[0][w]);
int i=1;    float t,o;         t=StrToFloat(Edit3->Text);

do{
        tabl[i][0]=i+1;
        tabl[0][1]=StrToFloat(Edit1->Text);
tabl[0][2]=StrToFloat(Edit2->Text);
        tabl[i][3]=tabl[i][2]-(tabl[i][2]-tabl[i][1])/goldenRatio;
        tabl[i][4]=tabl[i][1]+(tabl[i][2]-tabl[i][1])/goldenRatio;

                  if(fy( tabl[i][3])>=fy( tabl[i][3]))
                 {tabl[i][1]=tabl[i][3];
                 tabl[i][2]=tabl[i][4];}
        i++;

} while (fabs(tabl[0][2]-tabl[0][1])<t);



Edit4->Text=FloatToStr((tabl[i][1]+tabl[i][2])/2);
StringGrid1->RowCount=i+1;
for (int q=1; q<i; q++) {for (int w=0; w<8; w++) {StringGrid1->Cells[w][q+1]=FloatToStr(tabl[q][w]);}}

}
//---------------------------------------------------------------------------





void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->Cells[0][0]="Номер итерации";
StringGrid1->Cells[1][0]="A";
StringGrid1->Cells[2][0]="B";
StringGrid1->Cells[3][0]="B-A";
StringGrid1->Cells[4][0]="X1";
StringGrid1->Cells[5][0]="X2";
StringGrid1->Cells[6][0]="F(X1)";
StringGrid1->Cells[7][0]="F(X2)";
}

Последний раз редактировалось Аватар; 22.11.2017 в 14:18.
toha0074 вне форума Ответить с цитированием
Старый 22.11.2017, 14:18   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Это для кого написано модератором в посте #1?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.11.2017, 14:22   #7
toha0074
 
Регистрация: 13.11.2017
Сообщений: 8
По умолчанию

Эмммм..... Разве программа настолько большая, что в ней трудно разобраться?
Код:
#include <vcl.h>
#pragma hdrstop
#include "math.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
const double goldenRatio = 1.613033;
  double fy(double x){
  double k; k=-exp(-x)*log(x);
return k;};

void __fastcall TForm1::FormActivate(TObject *Sender)
{
double x,y;
Series1->Clear();
for (x=0.01; x<=10; x=x+0.01) { y=fy(x); Series1->AddXY(x,y);}
  y=0; x=0;
for (x=-20; x<=20; x=x+0.01) { y=0; Series2->AddXY(x,y);}
  y=0; x=0;
for (y=-20; y<=20; y=y+0.01) { x=0; Series3->AddXY(x,y);}
   Chart1->Refresh();
   Chart1->LeftAxis->Maximum=20;
   Chart1->LeftAxis->Minimum=-20;
   Chart1->LeftAxis->Increment=(Chart1->LeftAxis->Maximum-Chart1->LeftAxis->Minimum)/20;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
float** tabl = new float *[10];
      for (int i = 0; i < 10; i++)
         tabl[i] = new float[8];


tabl[0][0]=1;
tabl[0][1]=StrToFloat(Edit1->Text);
tabl[0][2]=StrToFloat(Edit2->Text);
tabl[0][3]=tabl[0][2]-tabl[0][1];
tabl[0][4]=tabl[0][1]+0.382*tabl[0][3];
tabl[0][5]=tabl[0][1]+0.618*tabl[0][3];
tabl[0][6]=fy(tabl[0][4]);
tabl[0][7]=fy(tabl[0][5]);

for (int w=0; w<8; w++) StringGrid1->Cells[w][1]=FloatToStr(tabl[0][w]);
int i=1;    float t,o;         t=StrToFloat(Edit3->Text);

do{
        tabl[i][0]=i+1;
        tabl[0][1]=StrToFloat(Edit1->Text);
        tabl[0][2]=StrToFloat(Edit2->Text);
        tabl[i][3]=tabl[i][2]-(tabl[i][2]-tabl[i][1])/goldenRatio;
        tabl[i][4]=tabl[i][1]+(tabl[i][2]-tabl[i][1])/goldenRatio;

                  if(fy( tabl[i][3])>=fy( tabl[i][3]))
                    {tabl[i][1]=tabl[i][3];
                    tabl[i][2]=tabl[i][4];}
        i++;

} while (fabs(tabl[0][2]-tabl[0][1])<t);



Edit4->Text=FloatToStr((tabl[i][1]+tabl[i][2])/2);
StringGrid1->RowCount=i+1;
for (int q=1; q<i; q++) {for (int w=0; w<8; w++) {StringGrid1->Cells[w][q+1]=FloatToStr(tabl[q][w]);}}

}
//---------------------------------------------------------------------------





void __fastcall TForm1::FormCreate(TObject *Sender)
{
   StringGrid1->Cells[0][0]="Номер итерации";
   StringGrid1->Cells[1][0]="A";
   StringGrid1->Cells[2][0]="B";
   StringGrid1->Cells[3][0]="B-A";
   StringGrid1->Cells[4][0]="X1";
   StringGrid1->Cells[5][0]="X2";
   StringGrid1->Cells[6][0]="F(X1)";
   StringGrid1->Cells[7][0]="F(X2)";
}
toha0074 вне форума Ответить с цитированием
Старый 22.11.2017, 18:59   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Присвоил, но ничего от этого не изменилось. Опять неверные результаты
Код:
do{
        tabl[i][0]=i+1;
        tabl[0][1]=StrToFloat(Edit1->Text);
        tabl[0][2]=StrToFloat(Edit2->Text);
ничего не скажешь.
Код:
                  if(fy( tabl[i][3])>=fy( tabl[i][3]))
                    {tabl[i+1][1]=tabl[i][3];
                    tabl[i+1][2]=tabl[i][4];}
а что в противном случае задавать данные СЛЕДУЮЩЕЙ (+1) итерации не надо?...
в таком разе и предыдущая рекомендация "почти" не нужна.
только "не забыть" сделать
Код:
tab[1]... =tab[0]...
или перенести if вверх по циклу и делать
Код:
tab[i][...] =tab[i-1]....
это несложно, разбирайтесь.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 22.11.2017, 21:44   #9
toha0074
 
Регистрация: 13.11.2017
Сообщений: 8
По умолчанию

Благодарю)
toha0074 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод золотого сечения c# peterson Помощь студентам 4 12.12.2012 21:49
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! OneBri Помощь студентам 0 03.10.2012 08:42
Метод золотого сечения Serg94 Помощь студентам 3 24.04.2012 14:47
Метод золотого сечения ramone Помощь студентам 0 14.05.2010 17:02
Метод золотого сечения Dasharnb777 Фриланс 4 15.02.2010 17:31