Библиотека численных методов для PascalABC.NET

Я выложу сразу исправленный - этот вопрос 1-2 суток. Надо всего лишь решить, как оценивать для аппроксимации/интерполяции, что тест прошел удовлетворительно. В конце-концов, это не готовый продукт, а лишь возможность дать желающим ознакомиться и потестировать. StudLibTest.pas (15,4 КБ)

Ну, мне кажется, что максимальное отклонение на некоторой области для нескольких известных функций - достаточно. Конечно, относительная погрешность. Можно с графиками.

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

Библиотека содержит 13 численных методов:

  • аппроксимации табличной функции полиномами Чебышева с использованием метода наименьших квадратов (класс ApproxCheb);
  • нахождение безусловного минимума функции многих переменных методом адаптивного случайного поиска (класс ARS);
  • решение систем линейных уравнений путем LU-разложения методом Гаусса (класс Decomp);
  • разложение полинома с целочисленными коэффициентами на рациональные линейные множители вида ux-v (класс Factors);
  • поиск минимума функции одной переменной на заданном интервале (класс FMin);
  • работа с рациональными дробями (класс Fraction);
  • нахождение всех корней полинома степени не выше 36 с действительными коэффициентами методом Ньютона - Рафсона (класс PolRT);
  • операции с полиномами (класс Polynom);
  • адаптивная квадратурная программа для вычисления определенного интеграла (класс Quanc8);;
  • изоляция корней уравнения y(x)=0 на заданном интервале просмотра (класс RootsIsolation);
  • интерполяция табличной функции кубическим сплайном (класс Spline);
  • поиск начального интервала неопределенности для локализации минимума унимодальной функции методом Свенна (класс Svenn);
  • отыскание корня уравнения на заданном интервале изоляции (класс Zeroin).

В класс Polynom добавлены методы экономизации EconomSym и EconomUnsym.

Пополнено и частично откорректировано содержимое файла с инструкциями StudLib.pdf. Обновление тестирующей программы StudLibTest снова немного запаздывает. StudLib.pas (44,6 КБ) StudLib.pdf (252,5 КБ)

Я переписывал на новый вид свои старые программы, нашёл одну которая вычисляет функцию по массиву точек полиномом Лагранжа, может добавите?

Вот всё что нужно из когда:

    Formule := new real[points.Count];
    foreach var p1 in points do
    begin
      var nFormule := new real[points.Count];
      nFormule[points.Count - 1] := p1.Item2;
      var c: word := points.Count - 1;
      foreach var p2 in points do
        if p1 <> p2 then
        begin
          var b := p2.Item1;
          for i: word := c to points.Count - 1 do
            nFormule[i - 1] -= nFormule[i] * b;
          c -= 1;
          var k := 1 / (p1.Item1 - b);
          for i: word := 0 to nFormule.Length - 1 do
            nFormule[i] *= k;
        end;
      
      for i: word := 0 to points.Count - 1 do
        Formule[i] += nFormule[i];
    end;

для работы ему нужно points:array of (real,real)

P.S. зачем в Polynom.Value переменная k?

А Вы как сами думаете, зачем тут k? Если не найдете ответа, считайте, что это моя прихоть была )))

function Value(x:real):real;
  begin
    Result:=a[0];
    var k:=1.0;
    for var i:=1 to n-1 do begin
      k*=x;
      Result+=a[i]*k
      end;
  end;

Я не могу сейчас решить этот вопрос. Во-первых, я слежу, чтобы программы были лицензионно - чистыми и удовлетворяли требованиям GNU LGPL, а о Вашей программе у меня нет информации. Во-вторых, к каждой программе должен идти набор различных тестов - я их не увидел. В третьих - должны быть корректное описание и краткая теория - их тоже нет. И последнее, еще раз: я ПОКА не готов ответить, есть ли смысл включать вычисление полинома Лагранжа, который всегда проходит через все заданные точки, если достаточно задать по-идиотски высокую точность, и полиномы Чебышева дадут то же решение, только коэффициенты будут вычислены точнее, если количество точек не 3-5.

ок считайте, что я дал идею добавить функцию находящую полином из массива точек я сейчас сам попробовал вбить синусоиду, на 20 точках уже погрешность невозможная, так что пожалуй стоит действительно использовать что то более… хорошее…

насчёт [quote=“RAlex, post:87, topic:1706”] чтобы программы были лицензионно - чистыми и удовлетворяли требованиям GNU LGPL [/quote]

ну, это прога на 50 строчек, которая бесполезно валяется в папке с моими бесполезными программами… использовал я википедию…

и какие проблемы могут быть с лицензионностью? вы же вставляете везде ссылки на источник и эта библиотека бесплатная

я немного почитал в интернете по этому поводу… и очень сомневаюсь, что у математических функций будут особенные параметры лицензии, тем более какие то сумасшедшие, запрещающие, по сути, делать на их основе бесплатные программы

P.S. упс

стоит спать больше 4 часов пожалуй :smiley:

Именно! А у Вашей программы ссылки никакой. Такое возможно, только если это авторское решение. Но я-то напишу свое авторство на пакете, а не Ваше и получится, что это моя программа, что совершенно некорректно. А чтобы так не получилось, в тексте программы и в описании приводится ссылка на автора. Поэтому, если будет принято решение включать, Вам придется тогда “расшифроваться”

По лицензионности. Если я беру текст программы с GNU LGPL - я могу с этим текстом делать, что хочу, но на автора обязан сослаться. Если лицензия иная - тут надо смотреть в каждом случае, потому что у PascalABC.NET именно GNU LGPL и все, что в него включается, должно иметь такую же лицензию.[quote=“Sun_Serega, post:88, topic:1706”] ок считайте, что я дал идею добавить функцию находящую полином из массива точек [/quote]

Чебышевская аппроксимация и экономизация в паре решают эту проблему. Внимательнее почитайте “сопроводилку” в pdf. Там же написано, почему полиномом не всегда хорошо приближать и когда этим заниматься вообще не стоит. Если у Вас аналитическая функция есть, её приближают иначе, а если точки - скорее всего они экспериментальные ( а больше их взять неоткуда - или измерили, или вычислили) и тогда сначала надо провести статобработку, чтобы выкинуть заведомо ошибочные и снять шум. По этому поводу еще буду писать целый раздел. Именно этот набор причин в совокупности определил мой ответ “отвечу позднее”.

Ну, я не знаю как правильно найти ссылку на изначальный материал, подойдёт ли википедия или надо искать какой то другой сайт, где патент и т.п… Поэтому оставил на вас :slight_smile:.

всм объяснить как работает программа? Эт можно, кидайте в личку что не понятно, а код можете использовать как свой собственный.

Не подойдет. “Вики” - народное творчество, зачастую там авторские права нарушаются. Если Вы пишете программу “по образу и подобию” (за исключением смешной замены a на b и цикла while на repeat), то ссылаетесь на эту программу (автор и издание, где её можно найти), если используете алгоритм - пишете, что программа авторская,на базе алгоритма, опубликованного там-то. Кстати, если источник - программа, там указано и лицензирование. Если Вы обратили внимание, я стараюсь брать за основу не случайные программы, а взятые из общепризнанных библиотек, Оттуда же берутся и тестовые примеры. Уже хотя бы потому, что там уделено внимание получению нужной точности и прочим контролям, чего обычно нет в “студенческих разработках”. Я уже писал, что к сожалению, пакеты прикладных программ - это большой объем работы и большой, нелегкий труд, если ставится задача сделать сколь-нибудь качественный продукт. Я убежден, что PascalABC.NET - образец продукта высокого качества и любое идущее с ним приложение не должно его “позорить”.

А вот этот номер не пройдет)) Вы думаете, у меня проблемы взять лагранжеву аппроксимацию из SSP, к примеру? Никаких! Но там будет гарантия качества и лицензионной чистоты. Проблема иная, повторюсь: нужно ли она вообще в этом пакете. Ведь задумка была сделать пакет по численным методам в помощь неспециалистам, так сказать, помочь им сделать в этом мире первые шажки. И тут не нужна сотня программ, чтобы они помирали от натуги, решая проблему с выбором метода. Как-то вот так…

Библиотека содержит 14 численных методов:

  • аппроксимация табличной функции полиномами Чебышева с использованием метода наименьших квадратов (класс ApproxCheb);
  • нахождение безусловного минимума функции многих переменных методом адаптивного случайного поиска (класс ARS);
  • решение систем линейных уравнений путем LU-разложения методом Гаусса (класс Decomp);
  • разложение полинома с целочисленными коэффициентами на рациональные линейные множители вида ux-v (класс Factors);
  • поиск минимума функции одной переменной на заданном интервале (класс FMin);
  • работа с рациональными дробями (класс Fraction);
  • нахождение всех корней полинома степени не выше 36 с действительными коэффициентами методом Ньютона - Рафсона (класс PolRT);
  • операции с полиномами (класс Polynom);
  • адаптивная квадратурная программа для вычисления определенного интеграла (класс Quanc8); - решение задачи Коши для системы обыкновенных дифференциальных уравнений методом Рунге - Кутты - Фельберга (класс RKF45);
  • изоляция корней уравнения y(x)=0 на заданном интервале просмотра (класс RootsIsolation);
  • интерполяция табличной функции кубическим сплайном (класс Spline);
  • поиск начального интервала неопределенности для локализации минимума унимодальной функции методом Свенна (класс Svenn);
  • отыскание корня уравнения на заданном интервале изоляции (класс Zeroin).

Пополнено и частично откорректировано содержимое файла с инструкциями StudLib.pdf. StudLib.pas (57,3 КБ) StudLibTest.pas (19,6 КБ) StudLib.pdf (291,4 КБ)

1 лайк

Внесены изменения в работу c классом FMin. Скорректировано описание. StudLib.pas (57,8 КБ) StudLibTest.pas (20,1 КБ) StudLib.pdf (314,0 КБ)

Как насчёт добавить шум Перлина?

P.S. сделайте пожалуйста в программе тестирования вместо коментария перед каждой секцией - регион, чтоб можно было сворачивать код:

{$region ARS}begin
...
end;{$endregion}

вместо

//ARS
begin
...
end;

P.P.S. в программе тестирования на строчке 628 наверно имелось в виду Spline4-4 а не Spline4-1

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

Шум Перлина это функция дающая случайные числа но более сглажено чем рандом, поэтому с помощью него можно делать красивые текстуры. Сам по себе он является функцией рандома+много математики… я подумал что раз есть часть “много математики” то он сюда подойдёт :slight_smile: Ну а вообще он может быть в нескольких измерениях, то есть он даёт не только сглаженый 2D график но и 3D, 4D и так далее, если бы вы сделали хотя бы сплайн для большего количества измерений это было бы уже лучше чем ничего.

По Вашим сообщениям на форуме я понял, что Вы работаете с графикой. От меня эта тематика очень далека. Но что Вам самому мешает сделать свою библиотеку графики и в зависимости от контента либо пополнить GraphABC/ABCSprites, либо это будет четвертая библиотека. В конце-концов, я не математик, я “простой советский инженер”, которому “вышку” давали два первых курса в объеме технического вуза. Посему я не вижу смысла лезть в чуждую предметную область без особой нужды.

Графическую библиотеку (вообще считая её размеры я не уверен, что можно считать это библиотекой, просто пара примитивов) я и так уже делаю, но лично для себя (хотя сюда я закину, вдруг, кому понадобится), но именно эта часть - математическая, поэтому обращаюсь сюда, ведь вы делаете библиотеку, в которой будет собраны математические функции, которые достаточно сложные чтоб иметь смысл ими делится, но достаточно простые, чтоб понять, что они делают, вроде ведь подходит шум Перлина под описание. Кроме того текстуры далеко не единственное применение, хотя изобретался он как раз для этого.

Не совсем так. Если Вы просмотрите начало ветки, там видно, что предварительно было достаточно большое обсуждение, в том числе, с разработчиками PascalABC.NET, нужна ли библиотека численных методов, и если нужна, то на какую аудиторию она будет ориентирована и какую область охватывать. Если забыли уже, откройте программу вузовского курса по численным методам и посмотрите перечень имеющихся там тем. Так что это не просто “математические функции”, это набор классов, который во-первых, позволит строить на базе PascalABC.NET 3.2 какие-то работы по курсу, во-вторых позволит решать практические задачи без обращения к каким-то сложным пакетам и в-третьих, покажет, как можно реализовать программирование задач средствами PascalABC.NET, уйдя от “стиля программирования 70-х годов”. И последнее, возможно, это поспособствует дальнейшей популяризации этой системы программирования. С этой целью я пишу руководство, в котором, быть может, несколько пространно, а местами, возможно даже излишне примитивно рассказываю о каждом численном методе. Но это лишь с целью сделать эти численные методы доступных пониманию школьниками, которым сей курс не читают)))

P.S. Тестовая программа в библиотеке численных методов, кстати, неплохой добавочный тест системы после очередного обновления))))

Библиотека содержит 15 численных методов:

  • аппроксимация табличной функции полиномами Чебышева с использованием метода наименьших квадратов (класс ApproxCheb);
  • нахождение безусловного минимума функции многих переменных методом адаптивного случайного поиска (класс ARS);
  • решение систем линейных уравнений путем LU-разложения методом Гаусса (класс Decomp);
  • разложение полинома с целочисленными коэффициентами на рациональные линейные множители вида ux-v (класс Factors);
  • поиск минимума функции одной переменной на заданном интервале (класс FMin); - поиск минимума функции многих переменных на заданном интервале (класс FMinN);
  • работа с рациональными дробями (класс Fraction);
  • нахождение всех корней полинома степени не выше 36 с действительными коэффициентами методом Ньютона - Рафсона (класс PolRT);
  • операции с полиномами (класс Polynom);
  • адаптивная квадратурная программа для вычисления определенного интеграла (класс Quanc8);
  • решение задачи Коши для системы обыкновенных дифференциальных уравнений методом Рунге - Кутты - Фельберга (класс RKF45);
  • изоляция корней уравнения y(x)=0 на заданном интервале просмотра (класс RootsIsolation);
  • интерполяция табличной функции кубическим сплайном (класс Spline);
  • поиск начального интервала неопределенности для локализации минимума унимодальной функции методом Свенна (класс Svenn);
  • отыскание корня уравнения на заданном интервале изоляции (класс Zeroin).

StudLib.pas (64,3 КБ) StudLibTest.pas (25,9 КБ) StudLib.pdf (385,0 КБ)

Библиотека содержит 14 численных методов:

  • аппроксимация табличной функции полиномами Чебышева с использованием метода наименьших квадратов (класс ApproxCheb);
  • решение систем линейных уравнений путем LU-разложения методом Гаусса (класс Decomp);
  • разложение полинома с целочисленными коэффициентами на рациональные линейные множители вида ux-v (класс Factors);
  • поиск минимума функции одной переменной на заданном интервале (класс FMin);
  • поиск минимума функции многих переменных на заданном интервале (класс FMinN);
  • работа с рациональными дробями (класс Fraction);
  • нахождение всех корней полинома степени не выше 36 с действительными коэффициентами методом Ньютона - Рафсона (класс PolRT);
  • операции с полиномами (класс Polynom);
  • адаптивная квадратурная программа для вычисления определенного интеграла (класс Quanc8);
  • решение задачи Коши для системы обыкновенных дифференциальных уравнений методом Рунге - Кутты - Фельберга (класс RKF45);
  • изоляция корней уравнения y(x)=0 на заданном интервале просмотра (класс RootsIsolation);
  • интерполяция табличной функции кубическим сплайном (класс Spline);
  • поиск начального интервала неопределенности для локализации минимума унимодальной функции методом Свенна (класс Svenn);
  • отыскание корня уравнения на заданном интервале изоляции (класс Zeroin).

Класс ARS удален; в класс FMinN помещен метод ARS (нахождение безусловного минимума функции многих переменных методом адаптивного случайного поиска). Добавлено описание метода ARS в руководство.

StudLib.pas (63,8 КБ) StudLibTest.pas (25,8 КБ) StudLib.pdf (399,5 КБ)

1 лайк