2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Линии уровня функции от 2 переменных [Delphi]
Сообщение11.04.2012, 12:48 


11/04/12
21
Здравствуйте, форумчане. Мне нужно запрограммировать нахождение линий уровня на графике в Delphi для такой функции:

$\dfrac {5 x y(x+y)}{x^2 y^2+1} + \sqrt{x^2 y^2+1}$

Понимаю, что функцию нужно приравнять к $\operatorname{const}$. Далее, как я думаю, нужно выразить одну переменную через другую. Но не получается у меня это. Может не туда копаю.
Прошу помочь определиться с выбором метода решения.
Буду благодарен за любые наводящие ответы.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение11.04.2012, 12:57 
Админ форума
Аватара пользователя


19/03/10
8952
 i  Тема перемещена в Карантин.

Чтобы оттуда выбраться

1. Запишите формулы в соответствии с требованиями Правил форума, т.е. в $\TeX$.
Краткие инструкции можно найти здесь: topic8355.html и topic183.html.
Кроме этого, в теме Видео-пособия для начинающих форумчан можно посмотреть видео-ролик "Как записывать формулы".

2. Приведите свои попытки решения задачи и объясните, что конкретно вызывает затруднения.

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.
________________
Всякий, кто поступил в университет, но не хочет сам учиться - враг своей страны, подрывающий ее научно-технический, интеллектуальный и оборонный потенциалы.
(c) по мотивам сообщения Yuri Gendelman.


-- Ср 11.04.12 14:48:17 --

Немного поправил формулу и вернул (пока в учебную математику).

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение11.04.2012, 15:42 


11/04/12
21
To Toucan, рассматриваемая область относится к численным методам.
Всё , тему можно закрывать.
Вдруг кому понадобится решение:
Код:
var
x,y,w : Real;
I,J : Integer;
zoom:double = 5;
colour : integer;


....................................

function TForm1.f(x,y : real):real;
begin
f:=5*(x+y)*(x*y)/(x*x*y*y+1)+sqrt(x*x*y*y+1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text<>'')and(Edit1.Text<>'Введите шаг') then
  zoom:=StrToFloat(Edit1.Text);
   w := 1/zoom;
   For I := 0 To Form1.ClientWidth Do
   Begin
      For J := 0 To Form1.ClientHeight Do
      Begin
         X := (Form1.ClientWidth/2-I)/zoom;
         Y := (Form1.ClientHeight/2-J)/zoom;
         colour := Round(f(x,y));
         If ((X > -w) And (X < w))
         Or ((Y > -w) And (Y < w))
         Then colour := 0;
         Canvas.Pixels[I, J]:= colour;
      End;
   End;
end;
....................................
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (not(key in ['0'..'9',#8,#44])) then key:=#0;
end;


 i  Переехали в Программирование. /Toucan

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 11:49 


01/07/08
836
Киев
Hasar1n в сообщении #559011 писал(а):
рассматриваемая область относится к численным методам.
Всё , тему можно закрывать.


Уверенность очень хорошо. Очень нужное качество для менеджера. А что у вас кроме? :?:

Hasar1n в сообщении #559011 писал(а):
Вдруг кому понадобится решение


Это не решение. Это типовой "зловред". Тему закрывать рано, "не говори гоп",нужно получить оценку вашего преподавателя. С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 14:33 


11/04/12
21
Не к численным, а к вычислительным.Извиняюсь, перепутал.
Мне не надо получать оценку, делал незнакомому человеку за спасибо, потратив целый день.
Кстати, там нужно кое-что подправить, чтобы изолинии были повернуты в нужную сторону. При проверке своего алгоритма на функции $f(z)=y^2+x-2\cdot y+1$ изолинии повёрнуты в другую сторону.
Почему "зловред"?

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 16:21 
Заслуженный участник


09/09/10
3729
Хотя бы потому, что присваивание Canvs.Pixels[I, J] := color работает настолько медленно, что это даже не смешно.
Цитата:
Note: Setting and getting individual pixels is thousands of times slower than performing graphics operations on regions. Do not use the Pixel array property to access the image pixels of a general array. For high-performance access to image pixels, see the TBitmap.ScanLine property.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 17:12 


01/07/08
836
Киев
Hasar1n в сообщении #559306 писал(а):
Мне не надо получать оценку, делал незнакомому человеку за спасибо, потратив целый день.

Я не говорю об оценке. Я имею в виду, что у вас отсутствует связь между словесной постановкой задачи, описанием выбранного алгоритма(отсутствует напрочь) и его реализацией. Если вы делаете для кого-то одолжение, то лучше было-бы сначала самому разобраться в постановке. То что вы выставили на форум, невозможно использовать на трезвую голову. Лучше вам не заниматься программированием, во всяком случае в той области которую вы называете вычислительные методы. А под "зловредностью" вашей программы я имею в виду урон который вы можете нанести своему незнакомому человеку, пусть и за спасибо, и другим, которые будут ориентироваться на авторитет форума. Главный девиз форума "здесь нет шары". Шара кроме бесплатной работы имеет значение - плохо сделанная работа(халтура). С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 21:37 


11/04/12
21
Joker_vD
Соглашусь с тем, что scanline работает намного быстрей. Но тут работа происходит не с Tbitmap.Canvas, а с TForm1.Canvas . Уже сделал некоторые поправки в программе, и работаю со сканлайном. Правда, все равно пока вывожу не линии уровня, а градиент, цвет которого в каждой точке определяет высоту. Но и с градиентом тоже есть нерешённые проблемы.
hurtsy
Учту дивиз форума. Постановка задачи и реализация не соответствуют. Решил задачу тупым перебором, т.к. для других методов не хватило знаний для понимания. Интересно строите мысль, сначала опуская человека по всем пунктам, а в конце, скорей всего из-за привычки, воздавая дань уважения к нему.
Если у вас есть мысли по поводу решения данной темы, описанной в заголовке, я бы с удовольствием выслушал Вас. Но пока кроме того, что я бездарь и руки у меня кривые, я, увы, ничего полезного не услышал.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 22:12 
Заслуженный участник


09/08/09
3438
С.Петербург
Hasar1n,
обычно под задачей построения линий уровня понимают нахождение их в виде, пригодном для дальнейшей обработки, например, в виде набора полигонов. Эту задачу Ваша программа не решает. Если же Вам надо было просто каким-то образом дать представление о значениях функции в разных точках, то вопросов, естественно, нет. При этом, если работа разовая (например, для вставки растровой картинки в документ), то и вопрос производительности критического значения не имеет.

Задача построения линий уровня в "традиционном понимании" обычно решается с помощью алгоритма триангуляции Делоне

Hasar1n в сообщении #559439 писал(а):
Учту дивиз форума.
Не стоит делать поспешных выводов о "девизе форума" на основании отдельных выступлений отдельных его участников.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение13.04.2012, 14:58 


01/07/08
836
Киев
Hasar1n в сообщении #559439 писал(а):
Если у вас есть мысли по поводу решения данной темы, описанной в заголовке, я бы с удовольствием выслушал Вас. Но пока кроме того, что я бездарь и руки у меня кривые

Я такого не писал, это Вы проявляете здоровую самокритичность да и телепатию. Предлагаю отвлечься от школярской постановки задачи.
И если это возможно отойти от
Maslov в сообщении #559457 писал(а):
Задача построения линий уровня в "традиционном понимании" обычно решается с помощью алгоритма триангуляции Делоне

За этой задачей "стоят" алгоритмы которыми мозг живого существа обрабатывает сигналы поступающие от глаз. А все что я писал ранее, я готов признать "провокацией" и готов принять участие в такой беседе.
Глаз не является ни фото, ни кино камерой, хотя бы потому, что обездвиженный глаз не воспринимает никакого изображения. В таком случае я согласен с Вашим "тему закрыть", создать её в том виде как пожелаете, мне кажется , что я никого не обидел. С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение13.04.2012, 20:34 


11/04/12
21
Maslov
Благодарю, что откликнулись, и предложили метод решения.
Цитата:
обычно под задачей построения линий уровня понимают нахождение их в виде, пригодном для дальнейшей обработки, например, в виде набора полигонов.

Да я подумывал о том, создать 2-мерный динамич. массив точек, и анализировать пиксели-соседи и если |pixel[i,j]-pixel[i+i1,j+j1]|< epsilon (где i1, j1 могут принимать целые значения от -1 до 1), то записывать координаты пикселя в N-ую сторку массива, если |pixel[i,j]-pixel[i+i1,j+j1]|> epsilon, то создавать N+1 строку массива и записывать точку туда. Если поэкспериментировать на разных функциях и создавать массивы, чтобы первый эл-нт j-той строки массива был равен последнему, то мы получали замкнутое пространство, другими словами набор полигонов. Но получается очень медленный алгоритм и также все это будет осуществляться методом проб и ошибок. Наверно придётся отказаться.
Так же нашёл книгу "Скворцов А. В. Триангуляция Делоне и её применение.", где рассматривается построение изолиний. Попробую почитать, но вот с матаном у меня проблемы.
hurtsy
Смысл вашего последнего комментария заключает в себе лишь отказ от метода, предложенного Максимом Масловым.
Но так и не было предложений каких-либо других решений. Мне кажется, что вы намекаете бросить эту затею. Также думаю, что незачем плодить одинаковые по смыслу темы.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение13.04.2012, 21:07 
Заслуженный участник


09/08/09
3438
С.Петербург
Hasar1n в сообщении #559745 писал(а):
Да я подумывал о том, создать 2-мерный динамич. массив точек, и анализировать пиксели-соседи и если |pixel[i,j]-pixel[i+i1,j+j1]|< epsilon (где i1, j1 могут принимать целые значения от -1 до 1), то записывать координаты пикселя в N-ую сторку массива, если |pixel[i,j]-pixel[i+i1,j+j1]|> epsilon, то создавать N+1 строку массива и записывать точку туда. Если поэкспериментировать на разных функциях и создавать массивы, чтобы первый эл-нт j-той строки массива был равен последнему, то мы получали замкнутое пространство, другими словами набор полигонов.
Растровые алгоритмы здесь плохо подходят. В частности, в случае медленно меняющихся участков поверхности достаточно велик риск получить вместо линии "не пойми что". Да и в достаточно хороших случаях линии получатся ступенчатыми из-за малого разрешения пиксельного массива. Лучше, на мой взгляд, пользоваться стандартными методами. Наверняка, для Delphi подобное уже сто раз написано.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение14.04.2012, 17:12 


01/07/08
836
Киев
Maslov в сообщении #559759 писал(а):
Растровые алгоритмы здесь плохо подходят. В частности, в случае медленно меняющихся участков поверхности достаточно велик риск получить вместо линии "не пойми что". Да и в достаточно хороших случаях линии получатся ступенчатыми из-за малого разрешения пиксельного массива.

Плохо понятно, какие задачи имеются в виду здесь. ТС начал с построения линий уровня для функций вида $z=f(x,y);$. Более сложной является построение линий уровня для неявной функции 2-х переменных вида $f(x,y,z)=0;$. Такие задачи любит матанализ. Задачи, которые решают с применением триангуляции Делоне, обычно относятся к непрерывному восполнению функций заданных на множестве точек. Множества бывают регулярными и нерегулярными. Обычно данные получаются в результате геодезических и геологических измерений. Методов восполнения много, но ни один из них не является общепризнанным. Триангуляция Делоне самый "модный". Стандартного метода, имхо, нет.
Maslov в сообщении #559759 писал(а):
В частности, в случае медленно меняющихся участков поверхности достаточно велик риск получить вместо линии "не пойми что".

Здесь вина не растрового метода, просто "линии уровня" не всегда являются линиями, а иногда могут быть плоскими фигурами.
Maslov в сообщении #559759 писал(а):
Да и в достаточно хороших случаях линии получатся ступенчатыми из-за малого разрешения пиксельного массива.

Пиксельный массив должен быть достаточного для задачи размера. :?

Hasar1n в сообщении #559745 писал(а):
Смысл вашего последнего комментария заключает в себе лишь отказ от метода, предложенного Максимом Масловым.
Но так и не было предложений каких-либо других решений. Мне кажется, что вы намекаете бросить эту затею.


Вольному -воля, но такого смысла мои посты не содержат. Вы сказали, что чувствуете слабость в матанализе. Во первых это при желании поправимо, а во вторых для этих задач матанализ не является необходимостью. 560 лет исполнилось со дня рождения Леонардо да Винчи. Он не слушал никаких курсов матанализа, но рисовал очень сложные для матанализа поверхности.
С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение14.04.2012, 17:22 
Заслуженный участник


09/08/09
3438
С.Петербург
hurtsy в сообщении #559973 писал(а):
Задачи, которые решают с применением триангуляции Делоне, обычно относятся к непрерывному восполнению функций заданных на множестве точек. Множества бывают регулярными и нерегулярными.
Да, Вы правы. Причем для регулярных (прямоугольных) сеток для построения триангуляции Делоне никакие специальные алгоритмы не нужны: треугольники строятся просто проведением диагоналей в прямоугольниках, образующих сетку.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение15.04.2012, 13:01 


11/04/12
21
Maslov
Как понял, триангуляция Делоне для непрерывных функций строится из прямоугольной сетки. А большие ли ошибки будут, если применять для прерывистых функций регулярную сетку?
hurtsy
Чтож, я ошибался, что вы хотите отговорить меня, и прошу прощения, был опрометчив. Вы наконец-то втянулись в разговор, связанный с темой. Спасибо.

(Оффтоп)

Я боготворю Леонардо Да Винчи с детства. Как помню его биографию, то его отец всегда говорил, где он может найти человека, знавшего ответ на его вопрос, и Леонардо шел к человеку и узнавал, что ему было нужно, куда скорей всего входили и вопросы, касающиеся матанализа.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group