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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2010, 19:59   #1
zoluxa
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 53
По умолчанию Экстремум функции

Вычислить с заданной точностью e=0.00001 экстремум функции y=x*x*x-6*x*x+9*x+4. На печать вывести таблицу значений аргумента х и функции у только при грубом значении шага изменения аргумента, а также вычисленное конечное значение экстремума и значение аргумента, при котором оно достигается. Грубое значение шага - 0.3, диапазон измерений аргумента (0.2;1.5). Я набросал но у меня считает не правильно:
#include <math.h>
#include <iostream.h>

int main()
{
double a=0.2,b=1.5,x0,xmax,ymax,y,x,h=0.3, e=0.00001;
x0=a;


for (x=0.2;x<=1.5;x+=h)
{
y=x*x*x-6*x*x+9*x+4;
cout<<x<<" "<<y<<"\n";
}

x=0.2;
y=x*x*x-6*x*x+9*x+4;
while (h>e)
{
y=x*x*x-6*x*x+9*x+4;
if (y>ymax)
{
ymax=y;
xmax=x;
x+=h;
h=h/2;
}
}
cout<<"ymax="<<ymax<<" \n"<<"xmax="<<xmax;


system("PAUSE");
return 0;
}
Помогите будь ласка, заранее благодарю)))
zoluxa вне форума Ответить с цитированием
Старый 16.03.2010, 20:41   #2
vitalant
Новичок
Джуниор
 
Регистрация: 16.03.2010
Сообщений: 2
По умолчанию Например вот так



#include <iostream>
#include <math.h>

using namespace std;

int main()
{
double a=0.2,
b=1.5,
x0 = a,
xmax,
ymax = a*a*a-6*a*a+9*a+4,
y,
x,
h=0.1,
e=0.001;



for (x=0.2;x<=1.5;x+=h){

y = x*x*x-6*x*x+9*x+4;
cout << x << " " << y << "\n";
}

x = 0.2;
y = x*x*x-6*x*x+9*x+4;
while(fabs(h-e)>0){
y=x*x*x-6*x*x+9*x+4;
if(y>=ymax){
ymax=y;
xmax=x;
x+=h;
// h=h/2;
}else break;
}
cout<<"ymax="<<ymax<<" \n"<<"xmax="<<xmax;


system("PAUSE");
return 0;
}

З.Ы. Что означает “Грубое значение шага” - не совсем понятно

Последний раз редактировалось vitalant; 16.03.2010 в 20:45.
vitalant вне форума Ответить с цитированием
Старый 16.03.2010, 21:04   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Господа, объясните мне, пожалуйста, с каких пор и в каких "математичних школах" с эпсилон стали сравнивать сам шаг?! Всегда считал, что сравнивать нужно модуль разности результатов двух последовательных проходов, шаг на втором из которых меньше (например, действительно, в 2 раза) шага на первом.
Vago вне форума Ответить с цитированием
Старый 16.03.2010, 21:15   #4
zoluxa
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 53
По умолчанию

Не, там нужно точность сравнивать с шагом иначе прога зацыклится. Грубое значение шага, это берешь сначала начальное значение а все последующие уменьшаеш на 2 : h=h/2; К стати работает, спасибо!!!!!
zoluxa вне форума Ответить с цитированием
Старый 16.03.2010, 21:15   #5
zoluxa
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 53
По умолчанию

vitalant респект)))
zoluxa вне форума Ответить с цитированием
Старый 16.03.2010, 21:38   #6
vitalant
Новичок
Джуниор
 
Регистрация: 16.03.2010
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Господа, объясните мне, пожалуйста, с каких пор и в каких "математичних школах" с эпсилон стали сравнивать сам шаг?! Всегда считал, что сравнивать нужно модуль разности результатов двух последовательных проходов, шаг на втором из которых меньше (например, действительно, в 2 раза) шага на первом.
Согласен в условии while действительно бред написан - т.к. это условие выполняется всегда , т.е. цикл получается бесконечным, а выход происходит после break

более правильно будет так:


#include <iostream>
#include <math.h>

using namespace std;

int main()
{
double a=0.2,
b=1.5,
x0 = a,
xmax,
ymax = a*a*a-6*a*a+9*a+4,
y,
x,
h=0.1,
e=0.001;



for (x=0.2;x<=1.5;x+=h){

y = x*x*x-6*x*x+9*x+4;
cout << x << " " << y << "\n";
}

x = 0.2;
y = x*x*x-6*x*x+9*x+4;
while(fabs(y-ymax)>=0){
y=x*x*x-6*x*x+9*x+4;
if(y>=ymax){
ymax=y;
xmax=x;
x+=h;
// h=h/2;
}else break;
}
cout<<"ymax="<<ymax<<" \n"<<"xmax="<<xmax;


system("PAUSE");
return 0;
}

З.Ы. А вообще все разновидности того, что является условием выхода из подобных циклов в учебниках по численым методам можно найти
vitalant вне форума Ответить с цитированием
Старый 16.03.2010, 22:09   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ну а дробление h зачем закомментировано?! А условие достижения р-та какое?!...Ну это хорошо, что положили начальное h=0.1 и случайно уткнулись в фактическую точку экстремума x=1. А если взять h, как в условии, 0.3 ?..
Vago вне форума Ответить с цитированием
Старый 16.03.2010, 22:25   #8
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от zoluxa Посмотреть сообщение
Не, там нужно точность сравнивать с шагом иначе прога зацыклится.
Ну с чего ей зацыкливаться?..

Код:
#include <iostream>
#include <math.h>
using namespace std;

double Fu( double x ) {
   return x*x*x-6.*x*x+9.*x+4.;
}


int main() {

   double a=0.2,
         b=1.5,
         diff2Steps,
         xMax,
         yMaxNext,
         yMaxPrev,
         y,
         x,
         h=0.3,
         e = 0.00001;
   int   nIter = 0;

   yMaxPrev = Fu( a ); xMax = a;
   for ( x = a; x <= b; x+=h ){
      y = Fu( x );
      if ( y > yMaxPrev ) {
         xMax = x;
         yMaxPrev = y;
      }
      cout << x << " " << y << endl;
   }

   do {
      h = h / 2.;
      yMaxNext = Fu( a ); xMax = a;
      for ( x = a+h; x <= b; x+=h ){
         y = Fu( x );
         if ( y > yMaxNext ) {
            xMax = x;
            yMaxNext = y;
         }
      }
      diff2Steps = fabs( yMaxNext-yMaxPrev );
      yMaxPrev = yMaxNext;
      ++nIter;
   } while ( diff2Steps > e );

   cout << "ymax=" << yMaxNext << endl << "xmax=" << xMax << endl;
   cout << "The extremum value has been reached with accuracy = " << e << " after " << nIter << " iterations." << endl;

   return 0;

}
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
функции tigrenok Общие вопросы C/C++ 0 19.06.2009 19:52
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
Функции xxxPascalxxx Помощь студентам 2 28.12.2007 18:04