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

Надо понимать, “панель навигации” - это отдельное окно в среде разработки? Но его нужно специально открывать / закрывать - опять неудобство. Впрочем, моё замечание - из области “дело вкуса”…

Нет, это панель с двумя комбобоксами над редактором. Включается через Вид->Панель навигации по коду

Спасибо, я знаю об этом. После того, как библиотека будет сформирована в запланированном объёме (еще будет статистика и пополнение существующих классов), она будет приведена к стандартному виду (interface + implementation)

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

И ещё. Машинный нуль корректнее определить через 1/2^n, где n = 64 - для 8-байтной мантиссы, n = 80 - для 10-б.м. Здесь нужно иметь в виду, что Intel-сопроцессоры внутри себя обрабатывают 80-бит, а при выдаче результата “на гора”, производят округление результата. Именно поэтому double всегда обеспечивается точностью 110^(-16), а extended - 2.2310^(-20). В этом отношении J.Debord (см. его комментарии о машинном нуле) тоже занижает в 5 раз возможности extended.

Вот этот архив (на я-диске): файл tpmathDbord.rar https://yadi.sk/d/BE0hheIh3DmH6p

1 лайк

Машинный ноль я определял так, как это делается в библиотеках (пакетах) Фортрана, которые до сих пор являются непревзойденным образцом проведения вычислений в научных и инженерных расчетах. Это же метод описывает, в частности, и Дж.Форсайт.

Вот этот архив

Большое спасибо, я обязательно посмотрю, что там и как.

И еще: в языке PascalABC.NET (как и в .NET) отсутствует тип extended, так что о нем смысла говорить нет.

На этот форум я заглянул, соблазнившись заявленной PascalABC.NET новизной - способностью к параллельному программированию. И, действительно, на 4х-ядерном процессоре программа перемножения 2х матриц производит ~ в 4 раза быстрее, чем на моно-процессоре. Но …

  1. При оптимизации происходит заметный провал по точности расчётов. Казалось бы, подумаешь, double vs extended - разница мантисс в 2 байта: если с 10 => 8 байтов проседание до 210^(-16) ещё терпимо, то с 210^(-16) до 2*10^(-12) уже недопустимо.

  2. Сомневаюсь, что PascalABC.NET “поднимет” проект РОС (расчёт оптических систем), которым я занимаюсь: более 10 модулей с ~ по 1000 операторов каждый. Если есть опыт, опровергающий это предположение, готов вникнуть и вложиться.

1 лайк

Нам трудно что-то сказать про Ваш проект.

Параллельность в .NET делается по-другому - механизм OpenMP реализован здесь лишь частично и в виде учебного проекта. Надо пользоваться штатными средствами - например, классом Task или методом LINQ AsParallel.

В принципе всё, что можно сделать на C#, можно сделать и на PascalABC.NET. Но надо ответить на вопрос, зачем работающий проект переводить на PascalABC.NET.

1 лайк

для этого есть тип decimal

Он-то есть, но фактически это тип для финансовых вычислений, для научных и инженерных расчетов он малопригоден. Плюс тормозит “ну очень сильно”.

1 лайк
  • вот в этом-то и вся беда, Станислав Станиславович. К сожалению …

Впрочем, не смотря на высокие мнения, проект РОС был реализован не на Си, а на Паскале в Дельфи. Так что, надеюсь, и у Вас не всё потеряно. Правда, для этого потребуется команда, под стать Borland. Но с такими кадрами, как RAlex должно всё получиться. Сам-то я уже близок к закату: мне бы вот только успеть РОС распараллелить

Буду заглядывать к вам: отрадно, что кто-то ещё пытается сохранить ясность мысли. Успехов Вам!

1 лайк

@ekvi, познакомился с любезно предоставленной Вами библиотекой. Конечно, за 9 лет паскаль сильно изменился и подобный код сейчас кажется чудовищным:

procedure PrinFac(Z            : PMatrix;
                  Lb, Ub, Nvar : Integer;
                  C, F         : PMatrix);
var
  I, J, K : Integer;
begin
  for I := Lb to Ub do
    for J := 1 to Nvar do
      begin
        F^[I]^[J] := 0.0;
        for K := 1 to Nvar do
          F^[I]^[J] := F^[I]^[J] + Z^[I]^[K] * C^[K]^[J];
      end;
end;

Когда мы обсуждали, какой могла бы быть библиотека численных методов (это можно проследить по данной ветке), то основным возражением было “А надо ли вообще?”. Участники обсуждения ставили вопрос о доверии. Если используется некий “коммерческий” пакет, пользователя “греет” мысль о низкой вероятности потерпеть неудачу из-за недостатков алгоритма или ляпов реализации. Это нормально. Поэтому самописный пакет, за котором стоит не корпорация, а никому не известный человек, даже не математик - “простой советский инженер”, не может рассчитывать на целевую аудиторию, к примеру, состоящую из научных работников. Но такая задача и не ставилась! В справочном руководстве сказано, что целевая аудитория - школьники и студенты. Конечно, это не означает, что были использованы какие-то “низкопробные” алгоритмы - я пытался найти все самое лучшее, удовлетворяющее лицензии GNU LGPL. И все же, главным было приобщить целевую аудиторию к миру объектных технологий, показать, как можно работать с библиотеками и приучить к такой работе. Вернусь к переданному Вами пакету. Многие имеющиеся там программы не могут быть включены в библиотеку численных методов, поскольку они к таковым не относятся. Я ориентировался на стандартный курс численных методов, читаемый в вузах, чтобы библиотека не стала безграничной. Но часть из программ все же может быть реализована и включена. К [моему] сожалению, трудоемкость портирования в PascаlABC.NЕT будет достаточно велика. Но тут уж ничего не поделаешь.

1 лайк

Рад, что оказался полезен .

Успехов всем!

1 лайк

Обновление библиотеки до версии 1.0.1. от 14.09.2019. Входит в дистрибутив PascalABC.NЕТ, начиная с версии 3.5.1 (сборка 2250 от 14.09.2019).

Исправлена ошибка в классе Fraction, связанная с появлением отрицательных значений в знаменателе простой дроби. Библиотека по-прежнему работоспособна, начиная с PascalABС.NЕТ версии 3.3, но в документации заранее указана версия 3.5, поскольку именно на ней запланирован рефакторинг кода.

2 лайка