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

В принципе, я готов оказать в этом деле посильную помощь. Но на “вперед” нужны:

  • отмашка от @Admin
  • цензура (что именно реализуем)
  • последконтроль (тестирование и стресс-тестирование) - это хорошо бы студентам дать, кривее все равно никто не сможет задать данные)
  • общая идеология (не библиотека нужна, а набор библиотек)
1 лайк

Вы сейчас о какой библиотеке? У меня просто набор отдельных модулей, реализующих отдельные задачи. Большая часть программ из Форсайта. Кое-что алгольное. Тот большой список алгоритмов - я могу из них портировать то, что будет предложено.[quote=“Admin, post:227, topic:143, full:true”] И тогда - была разница. За деньги и по спецификации. [/quote] Деньги - хорошо. Но я все же изначально системщик и электроник, проблемный программист уже потом. А системщики - они системщики навсегда, системщики лажать не приучены: слишком дорого это потом обходится.

Я говорил о достаточно небольшой библиотеке численных методов для целей обучения (термин - Ваш)

Алгоритмы на Алгол-60, список которых я приводил ранее, находятся в четырех книгах под названием "Библиотека алгоритмов 1б-50б (51б-100б, 101б-150б, 151б-200б)" Автор: Агеев М. И., Алик В. П., Галис Р. М., Марков Ю. И. Издательство: Советское радио Язык: Русский

В книгах приводятся описания алгоритмов по самому широкому кругу вопросов прикладной математики и программирования на алгоритмическом языке АЛГОЛ-60, публиковавшихся ранее в журнале «Communications of the ACM» (США), переведенных на русский язык, исправленных, улучшенных и отлаженных на ЭВМ авторами выпусков.

Понял. Будут пожелания, что туда должно войти? Например, вот класс для работы с простыми дробями, матричные операции и т.д. - это не численные методы, но они нужны бывают часто. Может, разбить на несколько библиотек?

Пока надо делать всё в одном месте, потом, возможно, разбивать на части. Всё будет зависеть от объёма.

Но вот допустим: https://www.codeproject.com/Articles/9078/Fraction-class-in-C

Как компилятор собирает код? Если встречается uses XXXXX, что происходит? Из ХХХХХ выбирается нужная часть кода или он линкуется целиком?

Линкуются только используемые функции. Но при компиляции разворачивается всё дерево модуля - увы

Посмотрел. А Вы посмотрели мой код класса? Вот этот

Там надо, конечно, доработать Print немного и еще не решен вопрос о переводе real -> fraction.

Посмотрел. Навскидку - нормально. А Вы посмотрели ссылку, которую я Вам скинул? Там - две страницы устранения каких-то тонких багов…

Пока бегло взглянул. Потом подробнее. Две страницы багов вот так с разгона впитать тоже непросто.

Куда будем код заливать и как вообще связь поддерживать? Все сюда, в конференцию?

class function operator + (a,b:fraction):=
    new fraction(a.numerator*b.denominator+b.numerator*a.denominator,
        a.denominator*b.denominator);

Вот это мне не нравится. Имеет тенденцию быстро расти. Там бы на GCD чего-то надо поделить

public
  numerator:BigInteger;
  denominator:BigInteger;

Вот это мне не нравится. Сделайте свойства. Поля - приватны. Решите, что знаменатель не может быть <0

Это есть - метод Trunc. Но постоянно к нему после каждой операции стучаться - тормоза идут куда больше, чем от роста разрядности. Проверено.

Я проверял - у меня обратные результаты

С этим были большие пляски. Возможно, я еще что-то не понимаю, но тут повод для большого разговора. Давайте подумаем, как его устроить. Может быть, найти полчаса на неделе и пообщаться вживую?

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

Да, получается, что был очень неправ. Матрица Гильберта 50-го порядка точно обращается по методу Гаусса-Жордана примерно за одну секунду! Proba.pas (8,1 КБ) В традиционной машинной арифметике эта задача невыполнима.

Вот пример портирования программы с языка Fortran-IV из книги Дж.Форсайта. Программа предназначена для интерполяции табличной функции, заданной значениями в n узлах, кубическим сплайном. В исходном варианте предлагается описать пять массивов, а затем вызвать сначала процедуру Spline с шестью параметрами, а затем получить искомое значение с помощью функции Seval, имеющей уже семь параметров. Выглядит это примерно так:

      REAL X(10), Y(10), B(10), C(10), D(10)
      REAL S, U, SEVAL
      INTEGER I, N
      N = 10
      DO 1 I=1,N
         X(I)=I
         Y(I)=X(I)**3
  1   CONTINUE
      CALL SPLINE (N, X, Y, В, C, D)
      U = 2.5
      S=SEVAL (N, U. X, Y, В, C, D)
      WRITE (6, 2) U, S
  2   FORMAT (2F 10.5)
      STOP
      END

После портирования вызов стал намного проще и современнее:

uses StudLib;

begin
  var n:=10;
  var x:=ArrGen(n,i->real(i+1));
  var y:=ArrGen(n,i->sqr(x[i])*x[i]);
  var Sp:=new Spline(x,y); // создаем сплайн с заданными узлами интерполяции.
  var u:=2.5;
  Println(u,Sp.Value(u)); // интерполированное значение 
end.

Модуль, реализующий класс, StudLib.pas (2,5 КБ) Конечно, он еще сыроват, но вполне работоспособен.