Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Объекты геометрической и арифметической прогрессий (Александр Михалицын, оценка: 1)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Aug 19, 2010 10:02 am (написано за 8 минут 49 секунд)
   Post subject: Объекты геометрической и арифметической прогрессий
Reply with quote

Примерно с полгода-год "нарисовал", эти два объекта, не из необходимости, а скорее из-за моего нездорового интереса к математике, и всему что с ней связано. (-:
Это своеобразное продолжение темы математики на нашем прекрасном и уютном форуме (-;, например тут (forum.dklab.ru/viewtopic.php?t=34336) мы обсуждали процесс реализации
объекта комплексного числа, тогда у нас развернулось интереснейшее обсуждение, благодаря которому я, и надеюсь, многие другие участники получили массу удовольствия и знаний! (-;
Тема числовых рядов, несомненно, не менее интересна и обширна, чем тема комплексных чисел, но я пока выкладываю только объекты двух известных мне типов числовых рядов - геометрической и арифметической прогрессий соответственно, но буду рад, если все это "разрастется" во что-то большее.

Эх... вот бы нам раздельчик посвященный математике, физике, химии сюда... (-;

Собственно вот код полугодичной давности:
Code (JavaScript): скопировать код в буфер обмена
Math.logAB = function(a, b)
{
        if (a > 0 && b > 0 && a != 1) return Math.log(b)/Math.log(a);
        throw new Error(a + ';' + b);
}

Math.root = function(a, b)
{
        return Math.pow(a, 1/b);
}

function ArifmeticProgression(a1, d)//a1 - first member of progression; d - substraction of progression
{
        //a1, d;
        this.getMemberByN = function(n)
        {
                if (IsN(n))
                {
                        return a1 + (n - 1)*d;
                } else {
                        return false;
                }
        }

        this.getMemberN = function(an)
        {
                var n = (an-a1)/d + 1;

                if (!IsN(n)) return false;

                return n;
        }

        this.getSn = function(n)
        {
                return (a1 + this.getMemberByN(n))*n/2;
        }

        this.a1 = function()
        {
                return a1;
        }

        this.d = function()
        {
                return d;
        }

        var IsN = function(n)
        {
                //
                return n == Math.abs(Math.floor(n)) && n != 0;
        }
}

//
ArifmeticProgression.two_elements = function(An, n, Ak, k)
{
        return new ArifmeticProgression(An - ((Ak - An)/(k - n))*(n - 1), (Ak - An)/(k - n));
}

function GeometricProgression(b1, q)//b1 - first member of progression; q - divider of progression;
{
        //b1, q;
        this.getMemberByN = function(n)
        {
                if (IsN(n))
                {
                        return b1*Math.pow(q, n - 1);
                } else {
                        return false;
                }
        }

        this.getMemberN = function(bn)
        {
                var n = Math.logAB(q, bn*q/b1);

                if (!IsN(n)) return false;

                return n;
        }

        this.getSn = function(n)
        {
                if (q != 1) return (this.getMemberByN(n + 1) - b1)/(q - 1);
                return b1*n;//
        }

        this.getSnInfinitely = function()
        {
                //
                return (Math.abs(q) < 1) ? b1/(1 - q) : false;
        }

        this.b1 = function()
        {
                return b1;
        }

        this.q = function()
        {
                return q;
        }

        var IsN = function(n)
        {
                //
                return n == Math.abs(Math.floor(n)) && n != 0;
        }
}

GeometricProgression.two_elements = function(Bn, n, Bk, k)
{
        return new GeometricProgression(Bn/Math.pow(Bn/Bk, (n-1)/(n-k)), Math.root(Bn/Bk, n - k));
}

var An = new ArifmeticProgression(1, -0.5);
WSH.Echo(An.getMemberByN(2));

var b = GeometricProgression.two_elements(8, 3, 16, 4);
WSH.Echo(b.b1() + ';' + b.q());
У меня с того момента появилось несколько идей по улучшению интерфейса и реализации объекта, в ближайшее время я займусь этим вопросом, а пока - выкладываю в том виде, в котором оно есть сейчас. Как всегда буду рад интересному обсуждению и критике. (-:

В ближайшее время оформлю Теховской разметкой процесс вывода решений систем в общем виде (для арифметической и геометрической прогрессий соответственно), которые я использовал
в методах GeometricProgression.two_elements и ArifmeticProgression.two_elements соответственно (ну вдруг, кого заинтересует...).

Отдельное спасибо хотелось бы сказать замечательному образовательному порталу univertv.ru благодаря которому я имею прекрасную возможность знакомится с вузовской (и не только) программой, по интересующим меня темам. (-;
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu Aug 19, 2010 8:20 pm (спустя 10 часов 18 минут; написано за 44 секунды)
   Post subject:
Reply with quote

Интересная статья по теме Энциклопедия чисел (Опубликовано в журнале "Компьютерра" №7 от 23 февраля 1998 года) (offline.computerra.ru/print/offline/1998/235/1098/).

Вообще числовые последовательности, например, арифметические и геометрические, можно грубо рассматривать как частный случай числовой функции, где аргументом является натуральное число.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Aug 20, 2010 8:04 am (спустя 11 часов 44 минуты; написано за 34 секунды)
   Post subject:
Reply with quote

Quote:
Интересная статья по теме Энциклопедия чисел (Опубликовано в журнале "Компьютерра" №7 от 23 февраля 1998 года).
Почитаю, спасибо огромное. (-;
Rumata wrote:
можно грубо рассматривать как частный случай числовой функции, где аргументом является натуральное число.
,
Согласен. (-;
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Aug 20, 2010 9:54 am (спустя 1 час 50 минут; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

Rumata,
посмотрел твое решение (forum.dklab.ru/viewtopic.php?p=187567#187567),
я, если честно, думал о "скрещивании" понятия "числовая последовательность" с понятием "массив", но пока удобного интерфейса не придумал. (-;

В ближайшее время продумаю интерфейс и выложу наброски сюда.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri Aug 20, 2010 10:57 am (спустя 1 час 2 минуты; написано за 15 минут 5 секунд)
   Post subject:
Reply with quote

Задача не настолько востребована (особенно в JavaScript), поэтому я ее рассматриваю всего лишь с точки зрения "красивой" реализации. Последовательности же можно реализовать с помощью обычного цикла
-- либо генерировать новый элемент по необходимости (current(), prev(), next() - итерационные методы выбора текущего, предыдущего и последующего члена последовательности, first(), item(i) - выбор первого или i-го элемента),
-- либо создать единовременно массив элементов заданного размера (описание - далее по тексту). Операции над элементами последовательности достаточно просты.

Я заметил, что старый код в теме Array.range - создание массива, содержащего интервал числовых элементов (forum.dklab.ru/viewtopic.php?p=187567#187567) может быть расширен для генерации произвольных последовательностей. Путем несложных модификаций был введен третий аргумент - callback-функция, генерирующая следующий элемент последовательности. Может быть полезна для генерации более сложных арифметических, геометрических и нечисловых последовательностей. Примеры в той теме.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML