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

Ваш аккаунт

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

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

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

из Pascal в С++

34K
05 января 2009 года
Snowman
15 / / 23.06.2008
помогите пожалуйста кто чем может. Особенно интересует repeat / until.

Код:
program pminf;
{квадратичной интерполяции-экстраполяции}
uses crt;
var xm, a, b, e, h, x: real; v: integer;

function fun(x: real): real;
{ вычисление значения функции в точке }
begin
  fun:=0.1*x*x*x-2*x*x+10*sqrt(x)
end;

function mkv(h, x1, e: real; var xm: real): real;
{ функция реализует метод квадратичной интерполяции-экстраполяции }
var f0, f1, f2, x0, x2, c, b: real;
begin
  xm:=x1;
  repeat
      x1:=xm;     x0:=x1-h; x2:=x1+h;
      f0:=fun(x0); f1:=fun(x1); f2:=fun(x2);    c:=1/2/h/h*(f0-2*f1+f2);
      b:=((-1)*f0*(2*x1+h)+4*f1*x1-f2*(2*x1-h))/2/h/h;
      xm:=(-1)*b/2/c
  until ((xm-x1)<e);
  mkv:=fun(xm);
end;
[COLOR="Red"]//++++++++++++++все что дальше не обязательно++++++++++++++++++[/COLOR]
begin  clrscr;
  writeln ('Нахождение минимума функции.');
  writeln ('Выберите метод вычисления минимума:');
  writeln ('1. Метод золотого сечения.');
  writeln ('2. Метод квадратичной интерполяции-экстраполяции.');
  writeln ('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -');
  write ('Введите номер варианта: '); read (v);
  case v of
    1:
      begin
        write ('Координата начала отрезка : '); read (a);
        write ('Координата конца отрезка  : '); read (b);
        write ('Точность                  : '); read (e);
        writeln ('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -');
        h:=mzols(a,b,e,xm);
        writeln ('F(x)=',h:12:5, ' x=',xm:12:5);
      end;
    2:
      begin
        write ('Начальный шаг поиска : '); read (h);
        write ('Точность             : '); read (e);
        write ('Начальное значение x : '); read (x);
        writeln ('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -');
        h:=mkv(h,x,e,xm);
        write ('F(x)= ', h:12:5, ' x=',xm:12:5)
      end
  else { иначе case}
    writeln ('Неверный ввод!')
  end; {конец case}
end.
535
05 января 2009 года
Нездешний
537 / / 17.01.2008
Код:
#include <math.h>

double fun(double x)
{
      return (0.1*x*x*x - 2*x*x - 10*sqrt(x));
}

double mkv(double h, double x1, double e, double& xm)
{
     xm = x1;
     do {
          x1 = xm;

          double f0 = fun(x1 - h);
          double f1 = fun(x1);
          double f2 = fun(x1 + h);

          double c = (f0 - 2*f1 + f2) / (2*h*h);
          double b = ((-1)*f0*(2*x1 + h) + 4*f1*x1 - f2*(2*x1-h)) / (2*h*h);
         
          xm = (-1) * b / (2 * c);
     } while ((xm - x1) < e);

     return fun(xm);
}

переменные/функции стоило бы назвать понятнее, кстати
34K
07 января 2009 года
Snowman
15 / / 23.06.2008
Подскажите пожалуйста что не так ? :confused:

Код:
//---------------------------------------------------------------------------
#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;

 printf ("Nachal'nyi shag poiska h: "); scanf ("%f", &h);

 printf ("Tochnost' e: ");              scanf ("%f", &e);

 printf ("Nachal'noe znachenie x: ");   scanf ("%f", &x);

 printf ("F(x)= %12.5f ,  x= %12.5f ",mkv(h,x,e,xm),fun(xm));

}

double fun(double x)
{
[COLOR="Red"] return (0.1*x*x*x - 2*x*x - 10*sqrt(x)); //invalid floating point operation[/COLOR]
}

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);
}
8.2K
07 января 2009 года
Pelican
115 / / 16.06.2007
Эта ошибка, как я понимаю, появляется при некоторых значениях входных данных...
Цитата:

207 Invalid floating point operation (Недопустимая операция с плавающей точкой).
Возможные причины сообщения:
• аргумент функций TRUNC или ROUND не может быть преобразован в целое число, находящееся внутри диапазона типа LONGINT (от -2147483648 до +2147483647);
• отрицательный аргумент функции SQRT (извлечение квадратного корня);
• аргумент функции LN (логарифм) равен нулю или имеет отрицательное значение;
• произошло переполнение стека сопроцессора.

87
07 января 2009 года
Kogrom
2.7K / / 02.02.2008
Много чего не нравится.

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

Во вторых, смущает си-стиль ввода-вывода. Есть подозрение, что и компилируется как си-программа. И если мне не изменяет память в си не передаются параметры в функцию по ссылке.

В любом случае, надо сделать проверку на отрицательность перед извлечением корня.

И еще. Увидел, что локальная переменная double xm ничем не инициализируется и сразу передается в fun(xm). Причем, программист наверно думал, что там установится какое-то значение функцией mkv(h,x,e,xm), но что-то мне это не очевидно. Я бы не рекомендовал эти две функции использовать в одном printf.
34K
09 января 2009 года
Snowman
15 / / 23.06.2008
сделал вот что но проблема не исчезла
Код:
void main ()
{
 double xm, e, h, x;

        printf ("Nachal'nyi shag poiska h: "); scanf ("%f", &h);

        printf ("Tochnost'           e  : ");  scanf ("%f", &e);

        printf ("Nachal'noe znachenie x : ");  scanf ("%f", &x);


        printf ("F(x)= %12.5e",mkv(h,x,e,xm));

        printf ("x= %12.5e ",fun(xm));

        }

double fun(double x)
{      double n;
        n = x ;
       [COLOR="Red"] if (n<0)  n = x * (-1);//invalid ...[/COLOR]
        return(0.1*x*x*x - 2*x*x - 10*sqrt(n));
}

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);
}


и при вводе чисел в переменных оказываются например 2,653435Е-314, в h вообще +NAN? Думаю все из-за этого, но почему, написано вроде верно.
87
09 января 2009 года
Kogrom
2.7K / / 02.02.2008
scanf("%lf", &h); // для double

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

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