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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2009, 23:07   #1
PS32
 
Регистрация: 02.04.2009
Сообщений: 7
По умолчанию Помогите пожалуйста!

Помогите пожалуйста с задачкой:
"Найдите наибольшее и наименьшее значения функции f(x)=3x^2+x-4, если на заданном интервале [xmin;xmax] аргумент изменяется с шагом dx"
Задачка вроде как простая, на цикл, просто я не силен в Паскале...
Прогу написал, но похоже неправильно (криво работает), посмотрите и подправьте пожалуйста:

Program LR;
Var
i,n,x,y,xmax,xmin,dx,ymax,ymin:inte ger;
begin
write ('xmin='); readln (xmin);
write ('xmax='); readln (xmax);
write ('dx='); readln (dx);
n:=xmax-xmin div dx;
ymin:=3*sqr(xmin)+xmin-4;
ymax:=3*sqr(xmax)+xmax-4;
for i:=1 to n do
begin
x:=xmin+n*dx;
y:=3*sqr(x)+x-4;
if y>ymax then ymax:=y;
if y<ymin then ymin:=y;
end;
writeln ('ymin=',ymin);
writeln ('ymax=',ymax);
readln;
end.

Не пойму что с шагом сделать, поэтому прога слегка бредовая...
PS32 вне форума Ответить с цитированием
Старый 02.04.2009, 23:19   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Код:
function f(x:real):real;
begin
   f:=3*sqr(x)+x-4;
end;
....
begin
...
x:=xmin; ymin:=f(x); ymax:=f(x);
while (x<=xmax) do begin
   x:=x+dx;
   if (f(x) < ymin) then ymin:=f(x);
   if (f(x) > ymax) then ymax:=f(x);
end;
...
end.
Проверить легко.. Это уравнение параболы с центром в точке (-1/6; -25/6), которая пересекает ось Ох в точках (-4/3; 0) и (1, 0). В таком случае на отрезке от 0 до 1 максимальное значение равно 0, а минимальное -4 =) (если я не ошибся в расчетах, перепроверь)
Uguu~

Последний раз редактировалось __STDC__; 02.04.2009 в 23:29.
__STDC__ вне форума Ответить с цитированием
Старый 02.04.2009, 23:22   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
Program LR; 
Var 
i,n,x,y,xmax,xmin,dx,ymax,ymin:integer; 
begin 
write ('xmin='); readln (xmin); 
write ('xmax='); readln (xmax); 
write ('dx='); readln (dx); 
n:=(xmax-xmin) div dx;
ymin:=3*sqr(xmin)+xmin-4; 
ymax:=3*sqr(xmax)+xmax-4; 
for i:=1 to n do 
 begin
 x:=xmin+i*dx;
 y:=3*sqr(x)+x-4;
 if y>ymax then ymax:=y;
 if y<ymin then ymin:=y;
 end;
writeln ('ymin=',ymin); 
writeln ('ymax=',ymax); 
readln; 
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.04.2009, 23:40   #4
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

вообще максимальное значение ф-ция примет там, где x по модулю максимален (т.е. в одной из крайних точек отрезка).. так что можно убрать из цикла одну проверку и написать до него
Код:
if (abs(xmax) > abs(xmin)) then ymax:=f(xmax) else ymax:=f(xmin);
(для xmax исп-ть abs() не обязательно)
Для минимального тоже скорее всего можно что-то подобное сделать.. лениво думать..

****

хотя что тут думать... тут все наоборот.. если взят отрезок слева от (-1/6; 0) то это f(xmax), если справа, то f(xmin), если (-1/6; 0) попадает в отрезок, то это f(-1/6), т.е. -25/6 (опять же если я не ошибся в расчетах)
Вот так.. анализировать можно без всяких циклов =) Хотя бы для таких простых задач...
Uguu~

Последний раз редактировалось __STDC__; 02.04.2009 в 23:54.
__STDC__ вне форума Ответить с цитированием
Старый 03.04.2009, 00:10   #5
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

я поясню рисунком пожалуй, чтобы стало понятней)) (прошу прощения, рисовать не умею):
231.jpg
итак, на рисунке три точки - корни и вершина параболы. Оси проходящие через вершину параболы отмечены пунктиром. Красный отрезок лежит слева от вершины. Очевидно, что в таком случае максимальным значением будет f(xmin), т.е. от левой границы отрезка, а минимальным - от правой. Обратно, в случае желтого отрезка, когда он справа от вершины. А вот когда вершина в отрезке (зеленый случай), действует правило с абсолютным значением (т.е. как крайняя левая так и крайняя правая точки отрезка могут давать максимальное значение ф-ции, т.к. ф-ция квадратичная). Минимальным же значением в любом случае является координата y вершины =) Вот так... все просто)
P.S. извиняюсь за такое развитие темы.. просто люблю подумать над алгоритмами =) может кому интересно будет..
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 03.04.2009, 21:52   #6
PS32
 
Регистрация: 02.04.2009
Сообщений: 7
По умолчанию

Огромное сасибо Sazary и __STDC__ за помощь.
1) __STDC__ с мат.анализом у меня дела обстоят лучше чем с програмированием на Паскале и я естественно все это для себя сразу расписал. Проблема в написании самой проги. Спасибо за идею с abs()-ами.
2) Sazary спасибо что подправил ошибки. Программа работает почти корректно (при x<0 считает ymax немного неверно, с этим, надеюсь, разберусь). Вопрос: как бы сделать так, чтобы не целые числа тоже можно было использовать? Если указать тип переменных real то прога отказывается работать (мне кажется это из-за "div dx".)
PS32 вне форума Ответить с цитированием
Старый 03.04.2009, 21:57   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Если указать тип переменных real то прога отказывается работать (мне кажется это из-за "div dx".)
Замените
Код:
n:=(xmax-xmin) div dx;
на
Код:
n:=round((xmax-xmin)/dx);
должно помочь.

PS32 А вообще, имхо лучше не считать n и делать через while.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 03.04.2009, 22:11   #8
PS32
 
Регистрация: 02.04.2009
Сообщений: 7
По умолчанию

Строчку заменил - все равно не работает... Error 26: Type mismatch.
(n:=round((xmax-xmin)/dx); извините, а что такое round?)
PS32 вне форума Ответить с цитированием
Старый 03.04.2009, 22:21   #9
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

какой смысл тогда использовать вещественные переменные если округлять? гораздо лучше сделать мой вариант... с while... а еще лучше без циклов вообще.. тогда шаг вообще не важен...
Ошибка связана с несоотвествием типов.. на какой строке? там номер должен быть...
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 03.04.2009, 22:23   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а что такое round?
Функция округления.
Вообще, у меня работает:
Код:
Program LR; 
Var 
i,n : integer;
x,y,xmax,xmin,dx,ymax,ymin : real;
begin 
write ('xmin='); readln (xmin); 
write ('xmax='); readln (xmax); 
write ('dx='); readln (dx); 
n:=round((xmax-xmin)/dx);
ymin:=3*sqr(xmin)+xmin-4; 
ymax:=3*sqr(xmax)+xmax-4; 
for i:=1 to n do 
 begin
 x:=xmin+i*dx;
 y:=3*sqr(x)+x-4;
 if y>ymax then ymax:=y;
 if y<ymin then ymin:=y;
 end;
writeln ('ymin=',ymin); 
writeln ('ymax=',ymax); 
readln; 
end.
Цитата:
Сообщение от __STDC__
какой смысл тогда использовать вещественные переменные если округлять?
Вообще я отвечал на вопрос. И менял соответственно то, что было.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите Помогите Пожалуйста Решить Одну Задачку в Паскале!!! VisTBacK Помощь студентам 6 19.09.2008 13:44