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


#1

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

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

Замечания и предложения
#2

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


#3

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


#4

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

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


#5

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


#6

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

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


#7

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


#8

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


#9

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

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


#10

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


#11

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


#12

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


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

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


#14
public
  numerator:BigInteger;
  denominator:BigInteger;

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


#15

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


#16

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


#17

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


#18

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


#19

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


#20

Вот пример портирования программы с языка 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 КБ) Конечно, он еще сыроват, но вполне работоспособен.