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.
из Pascal в С++
помогите пожалуйста кто чем может. Особенно интересует repeat / until.
Код:
#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);
}
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);
}
переменные/функции стоило бы назвать понятнее, кстати
Код:
//---------------------------------------------------------------------------
#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);
}
#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);
}
Цитата:
207 Invalid floating point operation (Недопустимая операция с плавающей точкой).
Возможные причины сообщения:
• аргумент функций TRUNC или ROUND не может быть преобразован в целое число, находящееся внутри диапазона типа LONGINT (от -2147483648 до +2147483647);
• отрицательный аргумент функции SQRT (извлечение квадратного корня);
• аргумент функции LN (логарифм) равен нулю или имеет отрицательное значение;
• произошло переполнение стека сопроцессора.
Во первых, в таких задачах с точностью (тут e) сравнивается модуль разности, причем для выхода из цикла он должен быть меньше точности.
Во вторых, смущает си-стиль ввода-вывода. Есть подозрение, что и компилируется как си-программа. И если мне не изменяет память в си не передаются параметры в функцию по ссылке.
В любом случае, надо сделать проверку на отрицательность перед извлечением корня.
И еще. Увидел, что локальная переменная double xm ничем не инициализируется и сразу передается в fun(xm). Причем, программист наверно думал, что там установится какое-то значение функцией mkv(h,x,e,xm), но что-то мне это не очевидно. Я бы не рекомендовал эти две функции использовать в одном printf.
Код:
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);
}
{
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? Думаю все из-за этого, но почему, написано вроде верно.
scanf("%lf", &h); // для double