Помощь - Поиск - Пользователи - Календарь
Полная версия: ЗАДАЧА НА ЧИСЛЕННЫЕ МЕТОДЫ
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Irina
Мне нужно сделать задачку на численные методы на Паскале, но вот , к сожалению, нигде не могу найти ничего подобного: ни в интернете, ни на форуме... Посмотрите, пожалуйста. Если знаете, как делать, то подскажите. Может быть , где-то есть что-то подобное?

ЗАДАЧА:
Найти минимум функции f(x,y) при условии g(x,y)=0 методом сканирования.

Ну вообще, я так понимаю, что в данном случаи нужно использовать двумерное сканирование, то есть сканировать обе оси :х и у. Только вот тут не получится, как при одномерном сканировании ориентироваться на перемену знака, тут придется пользоваться малостью функции /f(x,y)/<e.

Пожалуйста, если знаете , как реализовать эту задачу на паскале, то подскажите)
Irina
неужели эта задача на самом деле нерешаемая? wacko.gif
Lapp
Цитата(Irina @ 9.05.2007 22:31) *

если знаете , как реализовать эту задачу на паскале, то подскажите)
Irina, реализация на Паскале - дело нехитрое, я обещаю помочь, если никто раньше меня не сделает.
Но главное - уяснить алгоритм.
Хочешь, я скажу тебе, почему тебе никто не ответил раньше? Потому что условие несколько путаное. То есть со сканированием все более-менее ясно (хотя и не все), но потом ты добавляешь какие-то слова про малость функции и смену знака, и эти слова полностью сбивают с толку. При чем тут это? Какая связь минимума со знаком? Минимум может быть и положительный, и отрицательный, и ноль.. Сравнивать нужно только соседние значения функции (ну, или не только соседние) при этом условие типа:
A[i,j] < A[k,l]
- не имеет никакого отношения к знакам, на первый взгляд.. Если я что-то упускаю или не так понимаю метод сканирования, пожалуйста, поясни. И вообще, изложи чуть более точно этот метод. Было бы неплохо просто скопировать пару предложений из учебника или конспекта...
А написать программу сложности никакой не представит smile.gif.
Ну, давай, успехов.
Irina
Lapp, во-первых, большое спасибо за то , что откликнулся на просьбу и готов помочь.
Просто, на самом деле, я не очень понимаю, что нужно сделать, поэтому и обратилась за помощью... если б имела понятие, то пыталась бы всеми силами сама сделать. А тут даже не знаю, за что уцепиться.
Насчет метода сканирования я тоже толком не знаю. Это задание нам на самоизучение, а в интернете никакого достойного материала я не нашла, к сожалению. Знаю только то, что в алгоритме метода сканирования функция просматривается достаточно малыми шагами h : но тут дело в том, что надо просматривать не просто одну ось x, а надо, как я понимаю проходить по узлам плоскости. И еще , вроде бы функция g(x,y) именно 0 значение не примет, поэтому придется использовать что-то типа if abs(g(x,y))<10^(-7) и т.п...
Lapp, если не сложно, помоги сделать.* чувствую себя в эту минуту жутко тупой, мне стыдно*, но сама не могу справиться.

еще небольшое уточнение: появились точные значения функций:
f=x+y
g=x^2+y^2-5
Irina
Пожалуйста, посмотрите хоть кто-нибудь... подкиньте идею, если знаете)
Capitan Nemo
присоединяюсь к просьбе, у меня подобная задача, очень нужна помощь...
Lapp
Irina, извини, я просто случайно пропустил твою тему.. Исправлюсь.
Цитата(Irina @ 13.05.2007 1:23) *

в алгоритме метода сканирования функция просматривается достаточно малыми шагами h : но тут дело в том, что надо просматривать не просто одну ось x, а надо, как я понимаю проходить по узлам плоскости. И еще , вроде бы функция g(x,y) именно 0 значение не примет, поэтому придется использовать что-то типа if abs(g(x,y))<10^(-7) и т.п...
Lapp, если не сложно, помоги сделать.* чувствую себя в эту минуту жутко тупой, мне стыдно*

Если сканирование означает просто перебор значений функции - то без разницы: одномерная она, двумерная или десятимерная.
Сравнение с нулем действительно придется проводить с некоторой точностью (сначала я не совсем понял о чем речь). Естественно при этом в качестве точности брать, например, шаг сканирования. Можно также вводить значение точности как дополнительный параметр.

Чего тут стыдного?.. blink.gif не говори ерунды. Тот, кто хочет списать, обмануть - он обманет и не покраснеет. Тот, кто хочет разобраться - тот должен спрашивать. Это самый эффективный и по сути единственно верный способ образования. Так что, если ты "второго типа" smile.gif, то совершенно не нужно извиняться. Для того и форум.

Итак, тебе просто нужно организовать двойной цикл по координатам. Не совсем ясно, как выбрать границы сканирования. У тебя есть идеи?
Прогу я набросаю в общих чертах и кину сюда.
Lapp
Вот пример кода.
Я сделал ввод границ области сканирования и точности с клавиатуры. Рассмотри внимательно и разберись. Я написал некоторые комментарии, но ты спрашивай, если что непонятно.
function F(x,y:real):real;
begin
F:=x+y
end;

function G(x,y:real):real;
begin
G:=x*x+y*y-5
end;

var
x,x1,x2,xn,y,y1,y2,yn,s:real;
Flag:boolean;

begin
WriteLn('Введите границы области поиска:');
Write('x1='); ReadLn(x1);
Write('x2='); ReadLn(x2);
Write('y1='); ReadLn(y1);
Write('y2='); ReadLn(y2);
Write('Шаг сканирования s='); ReadLn(s);

Flag:=true; {признак поиска первой точки уд.условию}
y:=y1; {начало по y}
while y<=y2 do begin
x:=x1; {начало по x}
while x<=x2 do begin
if Abs(G(x,y))<s then begin {точка удовлетворяет условию}
if Flag then begin {это была первая точка уд.условию}
Flag:=False; {сбросили флаг}
xn:=x; yn:=y {запомнили точку}
end
else if F(x,y)<F(xn,yn) then begin {если значение F меньше имеющегося}
xn:=x; yn:=y {запомнили точку минимума}
end
end;
x:=x+s {продвигаемся по x}
end;
y:=y+s {продвигаемся по y}
end;
WriteLn('Минимум достигается в точке: x=',xn:5:8,' y=',yn:5:8);
ReadLn
end.
Учти, что метод этот довольно медленный! Если я задаю границы по обеим координатам от -10 до 10, а точность 0.001, то время расчета на моем P4 @ 1.7 ГГц больше полминуты. Когда разберешься с общим алгоритмом, можно будет заняться оптимизацией. Для этого есть ресурсы, хотя алгоритм (я имею в виду сканирование), конечно, принципиально небыстрый.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.