среда, 24 сентября 2008 г.

Основы информатики. Вычисление определенных интегралов. Метод Симпсона.

Метод трапеций наиболее прост, но не является оптимальным по быстродействию. Ненамного более громоздким, но значительно более оперативным является МЕТОД СИМПСОНА. Не вдаваясь в детали, укажем, что в этом методе отдельные участки подынтегральной функции представляются не линейной, как в методе трапеций, а квадратичной интерполяцией. По этой причине метод Симпсона имеет второе название - метод парабол. В этой методике число разбиений области интегрирования n должно быть четным. Тогда формула Симпсона запишется в виде:Для вычисления интеграла с заданной точностью можно начать, например, с n=2 и далее действовать аналогично методу трапеций, удваивать число разбиений.
В данном разделе было бы естественным представить методы вычисления кратных (двойных, тройных и так далее) определенных интегралов. Однако, мы отложим этот вопрос на будущее. Дело в том, что применение к кратным интегралам концепций методов трапеций или парабол сталкивается с рядом серьезных проблем. Так, для двойных интегралов, область интегрирования следовало бы разбивать на прямоугольные или квадратные малые подобласти. При этом возникает достаточно нетривиальная задача правильного учета произвольной формы границы. Еще большие проблемы связаны с аппроксимацией "вырезаемого" подобластью участка телом с достаточно просто вычисляемым объемом. Хотя указанные проблемы в принципе решаемы, более эффективным оказывается применение здесь одного из приложений общей концепции методики статистических испытаний или метода Монте-Карло. Рассмотрению этой концепции посвящен последний раздел этой главы, где и описаны средства вычисления кратных интегралов.


Методом трапеций и методом Симпсона вычислить с заданной точностью определенный интеграл:


Программный код:

procedure TForm1.Button1Click(Sender: TObject);
var
p,x,h,a,b,xch,xnch:real;
n,i:integer;
begin
a:=0;
b:=pi;
n:=strtoint(edit1.Text);
h:=(b-a)/n;
x:=sin(a)+sin(b);
xch:=0;
xnch:=0;
for i:=1 to n do
if i mod 2=0 then
xch:=xch+sin(a+i*h)
else
xnch:=xnch+sin(a+i*h);
x:=(x+4*xnch+2*xch)*h/3;
edit2.Text:=floattostr(x);
p:=abs((2-x)/2);
edit3.Text:=floattostr(p);
end;

Скачать проект

Вся теория

Основы информатики. Вычисление определенных интегралов. Метод трапеций.

Необходимость в вычислении определенных интегралов с использованием численных методов возникает, в основном, в двух случаях. Во-первых, подынтегральная функция может быть задана таблично, например, как полученная в результате каких-либо измерений. Во-вторых, первообразная не может быть найдена в аналитическом виде, то есть, интеграл не является табличным. Как и все вычислительные методы, численное интегрирование является приближенным, и интеграл может быть получен с заданной точностью. Простейшим методом численного интегрирования является МЕТОД ТРАПЕЦИЙ. Речь идет о вычислении интегралаМетод применим, если пределы интегрирования конечны, а подынтегральная функция не имеет особенностей, хотя несложная предварительная процедура деления интервала интегрирования на несколько частей позволяет применить эту методику и к интегрированию функции, имеющей конечное число разрывов первого рода. В методе трапеций интервал [a,b] разбивается на n элементарных отрезков длиной
точками с координатой
На каждом из элементарных отрезков подынтегральная функция заменяется линейной функцией, а соответствующий участок площади под кривой y=f(x) заменяется трапецией так, как это показано на рис. 1.7.
Исходя из известной формулы для площади трапеции, нетрудно получить выражение для приближенного значения интеграла:
Эту формулу наиболее удобно использовать, если интегрируется функция, заданная таблично, причем, координаты xi могут быть расположены на интервале [a,b] произвольным образом (не обязательно равноудалены друг от друга).
Для вычисления интеграла от функции, заданной аналитически, целесообразно воспользоваться другим представлением формулы трапеций. В этом случае отрезок [a,b] может быть разбит на n равных отрезков длиной h. При этом предыдущая формула упрощается и принимает вид:

Методом трапеций и методом Симпсона вычислить с заданной точностью определенный интеграл:


Программный код:
procedure TForm1.Button1Click(Sender: TObject);
var p,x,h,a,b:real;
n,i:integer;
begin
a:=0;
b:=pi;
n:=strtoint(edit1.Text);
h:=(b-a)/n;
x:=(sin(a)+sin(b))/2;
for i:=1 to n do
x:=x+sin(a+i*h);
x:=x*h;
edit2.Text:=floattostr(x);
p:=abs((2-x)/2);
edit3.Text:=floattostr(p);
end;

Скчать проект

Вся теория

вторник, 23 сентября 2008 г.

WinAPI: Enumwindows

Представьте, что вам надо свернуть все окна на рабочем столе, или передать всем запущеным программам и открытым окнам несколько сообщений... Или просто получить список всех запущеных программ и открытых окон. Как это сделать? Самый простой способ - использовать API Enumwindows, синтаксис которой представлен ниже.

function EnumWindows(EnumFunc: TFarProc, lParam: Longint): Bool;

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

function EnumWindowsProc(h:hwnd): Bool; stdcall;

Вот это минимальная необходимая фунция для работы с перечисляемыми окнами. Так как функция Enumwindows перечисляет handle всех окон и приложений, то главным и необходимым входящим параметром Enumwindowsproc будет handle получаемого объекта. (Хрень какую то пишу...). Ниже приведен кусок программы, которая сворачивает все возможные (видимые и невидимые, включая системный трэй) окна и программы в пуск. Не рекомендую так делать.

function enumwindowsproc(h:hwnd):bool; stdcall;
begin
closewindow(h);
enumwindowsproc:=true
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
enumwindows(@enumwindowsproc,0);
end;


Теперь посмотрим на главные особенности использования данной функции... Первое, не забудте, что в Enumwindows, на месте первого параметра вы указываете не описанную функцию, а адрес на нее (@). Второе, чтоб enumwindowsproc выполнялась ко всем окнам, необходимо в конце её тела сделать Callback, тоесть написать enumwindowsproc:=true. И третье, enumwindowsproc - просто стандартное название, изменить его можно на любое другое.:)

воскресенье, 21 сентября 2008 г.

Основы информатики. Методы поиска корней уравнений. Метод хорд. Delphi.

Более быстродействующим, по сравнению с методом половинного деления, является способ поиска корня, названный МЕТОДОМ ХОРД. Графическая иллюстрация метода представлена на рисунке 1.6. Для построения алгоритма метода хорд необходима дополнительная информация о характере поведения функции на интервале поиска корня. Прежде всего, необходимо гарантировать, что на этом интервале функция монотонна (монотонно возрастает или монотонно убывает). Кроме того, на всем интервале не должен меняться характер выпуклости или вогнутости. Иными словами, на [a,b] не должны менять знак ни первая, ни вторая производные функции. Вообще говоря, даже и при нарушении этих условий метод хорд можно применять, но с использованием специальных приемов, на которых мы не будем останавливаться. Проще всего в сомнительных случаях просто сузить интервал до такого размера, на котором производные знак не меняют.

Рис. 1.6. Различные варианты в методе хорд

Из геометрии рисунка 1.6 (подобия треугольников) можно найти точку m пересечения хорды с осью абсцисс. Поскольку , то Дальнейшее построение алгоритма зависит от соотношения знаков первой и второй производных. Если знаки производных различны - левая часть рисунка 1.6, то новым правым концом интервала поиска корня становится точка m, то есть делается замена b на m. В противном случае, соответствующем двум вариантам правой части рисунка 1.6, делается замена на m. Итерационный процесс продолжается до достижения необходимой точности.
  Метод хорд действительно значительно более оперативен по отношению к методу деления отрезка пополам. В этом можно убедиться, реализовав оба метода для нахождения корня одного и того же уравнения на одном и том же отрезке и при одной и той же точности. Следует, однако, заметить, что выигрыш во времени будет иметь место только при оптимально написанной программе. В первую очередь, необходимо сократить до минимума количество вызовов функции f(x). Так в приведенном выше выражении для величины m по два раза фигурируют функции f(a) и f(b). Разумеется, функцию необходимо посчитать один раз, запомнить ее значение в какой-либо переменной и во второй раз использовать уже не вызов функции, а эту переменную.
  Рассмотренные методы не исчерпывают арсенала средств поиска корней уравнений. Существуют методы более оптимальные либо по времени, либо по расходованию памяти компьютера. Кроме того, имеются методики, оптимальные для конкретных видов функций, для которых решается уравнение. Так, например, существуют алгоритмы, позволяющие находить группы корней, если функция является алгебраическим полиномом (причем корни могут быть найдены в комплексной области). Алгоритмы эти выглядят, однако, довольно сложными и не могут быть рассмотрены здесь.

Решить уравнение sin(x)=0,5 на промежутке [0,1].

Программный код:
procedure TForm1.Button1Click(Sender: TObject);
var
 a,b,e,m,ms,s:real;
begin
  a:=0;
  b:=1;
  m:=1;
  e:=strtofloat(edit1.Text);
  s:=0;
  while abs((m-ms)/m)>e do
  begin
  ms:=m;
  m:=(a*(sin(b)-1/2)-b*(sin(a)-1/2))/((sin(b)-1/2)-(sin(a)-1/2));
  b:=m;
  s:=s+1;
  end;
  edit2.Text:=floattostr(m);
  edit3.Text:=floattostr(s*2);
end;

Скачать проект

Основы информатики. Методы поиска корней уравнений. Метод деления отрезка пополам. Delphi.

  В данном разделе речь идет о численных методах решения уравнения f(x)=0 в области действительных чисел. В общем, виде задача может быть сформулирована следующим образом. Необходимо найти такое значение x1, которое приближенно совпадает со значением x0, обращающим уравнение в тождество. Требуется, однако, существенно дополнить постановку задачи. Во-первых, поскольку уравнение может и не иметь решения, следует быть уверенным в том, что поставленная задача имеет смысл - нельзя поймать черную кошку в темной комнате, если ее там нет. Во-вторых, поскольку уравнение может иметь несколько корней, необходимо ограничить интервал поиска отрезком [a,b], для которого известно, что на нем имеется только один корень. Признаком этого является то, что f(a) и f(b) имеют разные знаки. Термин "приближенно совпадает" также требует пояснения. Все приближенные методы нахождения корня строятся на основе итераций, когда очередное значение так или иначе получается из предыдущего и все ближе подходит к точному значению корня. Теперь можно сформулировать условие прекращения этого итерационного процесса. Процесс поиска корня следует прекратить тогда, когда относительная разность двух последовательных приближений станет по абсолютной величине меньше заданной точности. Если максимальная допустимая ошибка задана величиной , а два последовательных приближения являются значениями xn-1 и xn, то условие прекращения итераций примет вид:

  Неприятность может произойти, если корнем уравнения является 0, однако это уже совсем особый случай, который рассматриваться не будет.
 
Рис. 1.5. Графическая иллюстрация метода половинного деления

  Наиболее наглядным, простым в реализации, однако, увы, не самым лучшим численным методом поиска корней, является МЕТОД ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ. Суть метода проще всего проиллюстрировать графически, с помощью рисунка 1.5.
  Прежде всего, находится точка , делящая отрезок [a,b], на котором ищется корень, пополам. Еще раз напомним, что корень на этом отрезке обязан быть. Далее, из этих двух половин выбирается та, на концах которой функция имеет разные знаки, то есть та, на которой имеется корень. Если эта половина является отрезком [c,b], как на нашем рисунке, то новым левым концом отрезка становится точка с. В противном случае точка с становится новым правым концом отрезка. Таким образом, после каждого такого выбора мы имеем новый отрезок [a,b], к которому снова применяем половинное деление. В этом методе наиболее наглядно выглядит условие выхода из цикла  А почему мы здесь обошлись без знака абсолютного значения? Автор надеется, что читатель сможет дать ответ на этот вопрос самостоятельно.

Решить уравнение sin(x)=0,5 на промежутке [0,1].

Программный код:

procedure TForm1.Button1Click(Sender: TObject);
var
 e,a,b,c,s:real;
begin
 a:=0;
 b:=1;
 s:=0;
 e:=strtofloat(edit1.Text);
 while abs((b-a)/b)>e do
  begin
  c:=(a+b)/2;
  if (sin(a)-1/2)*(sin(c)-1/2)>0 then
  a:=c
  else
  b:=c;
  s:=s+1;
  end;
 edit2.Text:=floattostr(c);
 edit3.Text:=floattostr(s*2);
e
nd;

Скачать проект


WinAPI: Set/get windowtext

Set/get windowtext

Как можнодогадаться из названия данных API функций, речь пойдет о работе с заголовками различных окон и программ. С ними можно сделать что угодно. При том, используя API, работать можно с заголовками "чужих" окон и программ. Дот две функции, первая из которых служит для получения заголовка окна, а вторая для установления нового.

function GetWindowText(Wnd: HWnd; Str: PChar; MaxCount: Integer): Integer;

function SetWindowText(Wnd: HWnd; Str: PChar);


Рассмотрим первую функцию. Первый параметр указывает на окно, заголовок которой будет определяться. Второй - переменную, в которую будет заноситься заголовок. Третья определяет размер буфера, выделенного под заголовок. Приведенный ниже код позволяет определить заголовок программы.

procedure TForm1.Button1Click(Sender: TObject);
var r:array[1..255]of char;
begin
getwindowtext(application.Handle,@r,255);
showmessage(r)
end;


А вот так можно получать заголовки скрытых приложений и окон (по классам):

procedure TForm1.Button1Click(Sender: TObject);
var r:array[1..255]of char;
begin
getwindowtext(findwindow('progman',nil),@r,255);
showmessage(r)
end;


С помощью второй функции можно устанавливать свои заголовки. Рассмотрим её параметры. Первый указывает на окно, заголовок которого будем менять, а второй собственно и есть новый заголовок. Вот так можно менять у своей программы..

setwindowtext(application.Handle,'Hello!!!');

Чтоб поменять заголовок у формы, пиши.....

setwindowtext(Handle,'Hello!!!');

Чтоб у других программ и окон пиши...

setwindowtext(findwindow(nil,'Мой компьютер'),'Hello!!!');

Новости: Предварительные результаты тестов Radeon HD 4850 X2 оставляют не у дел GeForce GTX 280

 Битва в верхнем сегменте рынка графических ускорителей разворачивается в начале осени с новой силой. NVIDIA готовит ускоренный за счет включения дополнительных 24-х шейдерных процессоров GeForce GTX 260, который должен смотреться более выгодно на фоне быстрейшей из однопроцессорных карт конкурента, Radeon HD 4870.
 В то же время, AMD практически готова выпустить на рынок младшего брата самого быстрого из акселератора, коим, бесспорно сегодня является Radeon HD 4870 X2. Radeon HD 4850 X2, также, как и флагман линейки, будет представлять собой двухпроцессорный ускоритель, оснащенный двумя гигабайтами видеопамяти. В этом случае используется GDDR3, и ее частоты заметно ниже, всего 2 ГГц.
Также ниже частота процессоров RV770, примененных в решении, она составляет 625 МГц. Максимальное энергопотребление карты не должно превышать 230 Вт. Турецкому ресурсу Donanim Haber удалось получить ряд слайдов из официальной презентации продукта для партнеров AMD. 
Несмотря на то, что диаграмма сравнения производительности выполнена в лучших традициях служб маркетинга, показатели производительности Radeon HD 4850 X2 в сравнении с GeForce GTX 280 впечатляют.
В высоких разрешениях решение AMD демонстрирует более, чем 30% преимущество над конкурентом в Half Life 2 Ep.2 и Call of Duty 4. Меньше разрыв в Company of Heroes, World in Conflict и 3DMark Vantage, но тем не менее, Radeon HD 4850 X2 также впереди. При этом, цена акселератора будет находиться на уровне 399 долларов в то время, как GeForce GTX 280 продается на 20-40 долларов дороже.
Ждем очередного снижения цен со стороны NVIDIA.

Источник: Donanim Haber

суббота, 20 сентября 2008 г.

Программы: Hider 2

Програмка для скрытия различного рода окон от посторонних глаз.

Разработчик:VWS,2007
Размер: 218kBt
Скачать

WinAPI: Flashwindow

FlashWindow

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

function FlashWindow(Wnd: HWnd; Invert: Bool): Bool;

Функция имеет два параметра. Первый указывает на окно, которое будет мигать, а вторая на то будет ли оно мигать или нет. Возвратное значение: true - если окно было активным, false - если было неактивным. Приведенный ниже код заставит рамку окна программы мигать каждые три секунды:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Interval:=3000;
flashwindow(handle,true)
end;


Вот и все!!! скоро выложу мигание кнопки окна в системном трэе.

WinAPI: Showwindow и Findwindow

Showwindow и Findwindow

На данной странице речь пойдет о двух API функциях, с помощью которых осуществляется показ и скрытие различных окон, программ, элементов Windows с глаз пользователя. Рассмотрим каждую из функций подробнее...

function ShowWindow(Wnd: HWnd; CmdShow: Integer); 

Первый параметр функции указывает окно, с которым будет происходить та или иная операция, а второй указывает операцию, которая требуется. Нам нужны только две основные операции, это показ окна - sw_show и его скрытие - sw_hide. Список остальных операций с окном можно узнать из Microsoft Win32 Programmer's Reference, идущей в комплекте справки с Delphi.
Если мы хотим скрыть нашу программу, то пишем:

procedure TForm1.Button1Click(Sender: TObject);
begin
showwindow(application.MainForm.Handle,sw_hide);
end;


Чтобы скрыть кнопку программы из трэя и по Alt-Tab, пишем это...

procedure TForm1.Button1Click(Sender: TObject);
begin
showwindow(application.Handle,sw_hide);
end;


Ну и чтоб это все потом, естественно показать, на месте sw_hide пишем sw_show.
Рассмотрим вторую функцию:

function FindWindow(ClassName, WindowName: PChar): HWnd;

С помощью этой функции мы находим в системе окно по заданным нами параметрам. Возвратным значением данной функции будет handle искомого нами окна, если такое существует и 0, если не существует. Первый её параметр указывает на класс объекта, по которому во всей системе можно найти сам объект, а во втором параметре указывается текст в заголовке этого объекта. Например у нас есть открытая папка под названием "Музыка". Значит в заголовке открытого окна есть надпись "Музыка". Нам необходимо скрыть данное окно с рабочего стола. Для этого пишем: 

procedure TForm1.Button1Click(Sender: TObject);
begin
showwindow(findwindow(nil,'Музыка'),sw_show);
end;


После нажатия на кнопку, наше окно исчезнет с глаз долой. Но эксмериментировать с простыми окнами не интересно. Давайте немного позабавимся с ОС. Приведенный ниже код сможет скрыть весь traybar:

procedure TForm1.Button1Click(Sender: TObject);
begin
showwindow(findwindow('shell_tray_wnd',nil),sw_show);
end;


Здесь мы делаем поиск уже не по заголовку объекта, а по его классу. Константа "Shell_traywnd" указывает как раз на наш системный трэй. Если хорошо поискать такие константы, то можно например скрыть значки рабочего стола, написав константу "progman". Также можно скрыть кнопку пуск, или системные часы...