Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

нахождение экстремума функции F(x)

34K
03 февраля 2011 года
Snowman
15 / / 23.06.2008
методом квадратичной интерполяции экстраполяции. Нужна помощь, есть алгоритм вот в таком виде:
Код:
//---------------------------------------------------------------------------
#include<math.h>
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
//---------------------------------------------------------------------------
double fun (double);
double mkv (double, double, double, double &);
//---------------------------------------------------------------------------
void main ()
{
        double xm, e, h, x,z;
        printf ("Nachal'nyi shag poiska h: "); scanf ("%lf", &h);
        printf ("kolichestvo shagov poiska z: "); scanf ("%lf", &z);
        printf ("Tochnost'           e  : ");  scanf ("%lf", &e);
        printf ("Nachal'noe znachenie x : ");  scanf ("%lf", &x);
        printf ("F(x)= %12.5lf \n",mkv(h,x,e,xm));
        printf ("x= %12.5lf ",xm);
        getch();
}
//---------------------------------------------------------------------------
double fun(double x)
{
       return(x*x*x - 10*x - 5);// функция может быть любая, конкретно у этой нет экстремума.
}
//---------------------------------------------------------------------------
double mkv(double h, double x, double e, double& xm)
{
     xm = x;
     do {
          x = xm;
          double f0 = fun(x - h);
          double f1 = fun(x);
          double f2 = fun(x + h);
          double c = (f0 - 2*f1 + f2) / (2*h*h);
          double b = ((-1)*f0*(2*x + h) + 4*f1*x - f2*(2*x-h)) / (2*h*h);
          xm = (-1) * b / 2/ c;
        }
     while ((xm - x) < e);
     return fun(xm);
}
//---------------------------------------------------------------------------


нужно сделать на выходе из цикла счетчик чтобы чтобы он прекращался либо по достижению точности либо по количеству шагов что быстрее наступит. Подскажите пожалуйста.
33K
04 февраля 2011 года
hivewarrior
205 / / 16.11.2010
 
Код:
while ((xm - x) < e);

Это отвечает за точность.

Дополним код на количество итераций
Код:
#define ITERATIONS 1000 // Здесь можешь изменять количество итераций
...
int am=0;
do {
          if(am>ITERATIONS)
                    break;
...
          am++;
        }
     while ((xm - x) < e);
...
535
04 февраля 2011 года
Нездешний
537 / / 17.01.2008
[QUOTE=Snowman]x*x*x - 10*x - 5 // функция может быть любая, конкретно у этой нет экстремума.[/QUOTE]Матан-то точно сдал?
34K
04 февраля 2011 года
Snowman
15 / / 23.06.2008
эмм..вообще то я представления не имею как вручную проделать эти вычисления, у меня есть алгоритм, вот пытаюсь сделать. Скорее всего там при определенных входных данных она не имеет экстремума. И ещё нас учили что define это плохо? хотя главное смысл
33K
04 февраля 2011 года
hivewarrior
205 / / 16.11.2010
Цитата: Snowman
эмм..вообще то я представления не имею как вручную проделать эти вычисления, у меня есть алгоритм, вот пытаюсь сделать. Скорее всего там при определенных входных данных она не имеет экстремума. И ещё нас учили что define это плохо? хотя главное смысл


Уже производную не могут посчитать в уме. БИДА!

Код:
void main ()
{
        double xm, e, h, x,z;
...
        printf ("F(x)= %12.5lf \n",mkv(h,x,e,z,xm));
...
}
...
double mkv(double h, double x, double e, double z, double& xm)
{
     int am=0;
     xm = x;
     do {
          am++;
          ...
          if(am>z)
               break;
        }
     while ((xm - x) < e);
     return fun(xm);
}

Я сегодня добрый:rolleyes:
34K
05 февраля 2011 года
Snowman
15 / / 23.06.2008
спасибо, а вот так правильно будет?
Код:
//---------------------------------------------------------------------------
#include<math.h>
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
//---------------------------------------------------------------------------
double fun (double);
double mkv (double, double, double, double &,double);
//---------------------------------------------------------------------------
void main ()
{
        double xm, e, h, x,z;
        printf ("Nachal'nyi shag poiska h: "); scanf ("%lf", &h);
        printf ("vvedite kol-vo shagov z: "); scanf ("%lf", &z);
        printf ("Tochnost'           e  : ");  scanf ("%lf", &e);
        printf ("Nachal'noe znachenie x : ");  scanf ("%lf", &x);
        printf ("F(x)= %12.5lf \n",mkv(h,x,e,xm,z));
        printf ("x= %12.5lf ",xm);
        getch();
}
//---------------------------------------------------------------------------
double fun(double x)
{
       return(x*x*x - 10*x - 5);
}
//---------------------------------------------------------------------------
double mkv(double h, double x, double e, double& xm,double z)
{
     int am=0;
     xm = x;
     do { am++;
                    x = xm;
          double f0 = fun(x - h);
          double f1 = fun(x);
          double f2 = fun(x + h);
          double c = (f0 - 2*f1 + f2) / (2*h*h);
          double b = ((-1)*f0*(2*x + h) + 4*f1*x - f2*(2*x-h)) / (2*h*h);
          xm = (-1) * b / 2/ c;
          if(am>z) break;
        }
     while ((xm - x) < e);
     if (xm<-100||xm>100||am==z)
        {
                cprintf("Reshenie poluchit' nevozmozhno \n\r");
                        if (am==z)
                                cprintf("extremum funkcii otsutstvuet \n\r");
                        else
                                cprintf("vishli iz predela poiska \n\r");
        }
     else
        {
           return fun(xm);
        }

}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог