diff --git a/VisualPascalABCNET/DS/VisualEnvironmentCompiler.cs b/VisualPascalABCNET/DS/VisualEnvironmentCompiler.cs index e4ad27822..a8d421ae5 100644 --- a/VisualPascalABCNET/DS/VisualEnvironmentCompiler.cs +++ b/VisualPascalABCNET/DS/VisualEnvironmentCompiler.cs @@ -26,7 +26,7 @@ namespace VisualPascalABC { PascalABCCompiler.CompilerType defaultCompilerType = PascalABCCompiler.CompilerType.Remote; - public static Encoding DefaultFileEncoding = Encoding.GetEncoding(1251); + public static Encoding DefaultFileEncoding = Encoding.UTF8; private IWorkbench workbench; private PascalABCCompiler.RemoteCompiler remoteCompiler; diff --git a/VisualPascalABCNET/Workbench/FileOperations.cs b/VisualPascalABCNET/Workbench/FileOperations.cs index 6942dd47d..7ec03cc4d 100644 --- a/VisualPascalABCNET/Workbench/FileOperations.cs +++ b/VisualPascalABCNET/Workbench/FileOperations.cs @@ -369,7 +369,7 @@ namespace VisualPascalABC CodeFileDocumentControl dt = TbPage; WatcherService.DisableWatcher(FileName); //dt.TextEditor.Encoding = VisualEnvironmentCompiler.DefaultFileEncoding; - if (!dt.TextEditor.CanSaveWithCurrentEncoding()) + if (!dt.TextEditor.CanSaveWithCurrentEncoding() || true) { dt.TextEditor.Encoding = Encoding.UTF8; dt.TextEditor.SaveFile(FileName); diff --git a/bin/Lib/NumLibABC.pas b/bin/Lib/NumLibABC.pas index e7b4289a1..cdfe2809a 100644 --- a/bin/Lib/NumLibABC.pas +++ b/bin/Lib/NumLibABC.pas @@ -1,6 +1,6 @@ unit NumLibABC; -const &NumLibABCVersion = 'NumLibABC 1.0.0 06.09.2017'; +const &NumLibABCVersion = 'NumLibABC 1.0.0 от 06.09.2017'; type Point=auto class @@ -13,19 +13,19 @@ end; {$region ApproxCheb} type - /// - /// + /// Аппроксимация табличной функции полиномами Чебышева + /// по методу наименьших квадратов ApproxCheb=class private - nt:integer; // - a:array[,] of real; // (. MatrCreate) + nt:integer; // количество точек + a:array[,] of real; // расширенная матрица системы (см. MatrCreate) procedure MatrCreate; - // - // n + // заполняет матрицу а для решения СЛАУ с целью получения + // коэффициентов интерполяционного полинома степени n begin - a:=new real[r+1,r+2]; // + a:=new real[r+1,r+2]; // инициализация нулями var p,s:real; for var i:=0 to r do begin (p,s):=(1.0,x[i]); a[i,r+1]:=f[i]; @@ -34,9 +34,9 @@ type end; procedure Gauss; - // 3.1 - // .: .. - // , . - : "", 1991. + // Базируется на программе 3.1Р + // В кн.: Мудров А.Е. Численные методы для ПЭВЫМ на языках + // Бейсик, Фортран и Паскаль. - Томск: МП "Раско", 1991. begin var n1:=r+1; c:=new real[n1]; @@ -64,25 +64,25 @@ type public - x:array of real; // - y:array of real; // - tol:real; // - r:integer; // (r0 then cond:=1 @@ -203,15 +203,15 @@ type public - a:array[,] of real; // + a:array[,] of real; // исходная матрица cond:real; - ipvt:array of integer; // - det:real; // a + ipvt:array of integer; // вспомогательный вектор + det:real; // детерминант матрицы a constructor(a:array[,] of real); begin n:=a.RowCount-1; - Assert((n=a.ColCount-1) and (n>=0),'DECOMP: '); + Assert((n=a.ColCount-1) and (n>=0),'DECOMP: исходная матрица не квадратная'); Self.a:=new real[n+1,n+1]; for var i:=0 to n do for var j:=0 to n do @@ -220,20 +220,20 @@ type Decomp end; - /// - /// . + /// Решение системы линейных уравнений для заданного + /// вектора правых частей уравнения. procedure Solve(b:array of real); // - // b - . - // ipvt Decomp. + // Массив b - вектор правых частей систеы. + // Массив ipvt является результатом вызова Decomp. // - // -, - // . ., ., . - // " ", - // ., "", 1980. + // Является результатом переработки одноименной фортран-программы, + // приведенной в кн. Дж.Форсайт, М.Малькольм, К.Моулер + // "Машинные методы математических вычислений", + // М., "Мир", 1980. // begin - Assert(b.Length-1=n,'DECOMP/SOLVE: '); + Assert(b.Length-1=n,'DECOMP/SOLVE: неверная длина вектора правых частей'); for var k:=0 to n-1 do begin var m:=ipvt[k]; Swap(b[m],b[k]); @@ -254,8 +254,8 @@ end; {$region Factors} type - /// - /// ux-v + /// Разложение полинома с целочисленными коэффициентами + /// на рациональные линейные множители вида ux-v Factors=class private @@ -270,31 +270,31 @@ type Self.n:=a.Length-1; end; - /// - /// ux-v + /// Разложение полинома с целочисленными коэффициентами + /// на рациональные линейные множители вида ux-v function Factorize:array[,] of integer; // - // . - // : - // [0,0] - ; - // [0,1] - ; - // i- + // Коэффициенты полинома должны задаваться в порядке возрастания степени. + // Возвращаемый массив: + // [0,0] - количество найденных линейных множителей; + // [0,1] - максимальный НОД коэффициентов полинома; + // Каждая последующая i-я строка содержит коэффициенты множителя // [i,0]=u, [i,1]=v // - // : , , - // . + // Замечание: В случае, если свободный член нулевой, предварительно следует + // вынести аргумент за скобку и производить поиск в оставшемся полиноме. // - // 75 ( -60) - // . .., .., .. - // 51-100. ( ). - // .2. ., ".", 1976 + // Является переработкой алгоритма 75б (язык Алгол-60) + // В кн. Агеев М.И., Алик В.П., Марков Ю.И. + // Библиотека алгоритмов 51б-100б. (Справочное пособие). + // Вып.2. М., "Сов.радио", 1976 // begin var f,g,q:integer; var (r,c):=(0,1); Result:=new integer[n+1,2]; var b:=a.Reverse.ToArray; - while b[n]=1 do begin // (1*-0) + while b[n]=1 do begin // исключим множители (1*х-0) n-=1; r+=1; (Result[r,0],Result[r,1]):=(1,0); end; @@ -335,7 +335,7 @@ end; {$region FMin} type - /// + /// Нахождение минимума функции на заданном интервале FMin=class private @@ -345,19 +345,19 @@ type procedure FMin; - // f(x) [a;b] - // - // . , - // . - // , - // , 1.324... - // - // , . - // : real: - // . + // Нахождение локального минимума функции f(x) на интервале [a;b] + // Метод использует комбинацию поиска золотого сечения и последовательной + // параболической интерполяции. Сходимость никода не бывает хуже, чем при + // фибоначчиевом поиске. Если функция имеет непрерывную положительную вторую + // производную в точне минимума, не совпадающем с текущими границами интервала + // поиска, сходимость сверхлинейная и обычно имеет порядок 1.324... + // Бесполезно пытаться задавать точность е меньше значения квадратного корня + // из машинной точности, принимаемого по умолчанию. + // Результат: кортеж двух переменных типа real: + // найденные значения аргумента и вычисленной для него функции. // - // Fortran90 (John Burkardt). - // : + // На основе версии Fortran90 (John Burkardt). + // Алгоритм: // Richard Brent, // Algorithms for Minimization Without Derivatives, // Dover, 2002, @@ -366,7 +366,7 @@ type begin var d,fu,u,tol1:real; - var c:=0.5*(3-Sqrt(5.0)); // , + var c:=0.5*(3-Sqrt(5.0)); // квадрат величины, обратной золотому сечению var(sa,sb):=(a,b); x:=sa+c*(b-a); var w:=x; @@ -383,9 +383,9 @@ begin var m:=0.5*(sa+sb); var tol:=eps*Abs(x)+t; var t2:=2*tol; - // + // проверка критерия выхода if Abs(x-m) <= t2-0.5*(sb-sa) then break; - // ? + // приемлема ли парабола? var r:=0.0; var q:=r; var p:=q; @@ -396,21 +396,21 @@ begin q:=Abs(q); r:=e; e:=d end; if (Abs(p)0.0 then u:=x+tol else u:=x-tol; fu:=f(u); - // + // Обновить найденные параметры if fu<=fx then begin if ureal; a,b:real; t:real:=1.05e-8); begin @@ -449,26 +449,26 @@ end; {$region FMinN} type - /// + /// минимизация функции многих переменных FMinN=class private - delta:array of real; // HJ - fbefore:real; // - newx:array of real; // HJ + delta:array of real; // инициализируется HJ + fbefore:real; // значение функции при входе + newx:array of real; // инициализируется HJ - fun:function(x:array of real):real; // + fun:function(x:array of real):real; // целевая функция function BestNearby:real; - // , ( ) - // BEST_NEARBY. - // : + // Поиск точки, лучше исходной (по одному параметру за шаг) + // За основу взят текст программы BEST_NEARBY. + // Источник: // TOMS178 // Minimization by Hooke-Jeeves Direct Search // FORTRAN-90 version by John Burkardt. // ( Dept. of Scientific Computing, Florida State University ), - // GNU LGPL + // на условиях GNU LGPL begin Result:=fbefore; var z:=Copy(newx); @@ -497,8 +497,8 @@ type public n:integer; - iter:integer; // - x:array of real; // + iter:integer; // число итераций + x:array of real; // вектор аргументов constructor (px:array of real; f:function(x:array of real):real); begin @@ -509,15 +509,15 @@ type Randomize; end; - /// + /// Нахождение безусловного минимума методом адаптивного случайного поиска procedure ARS(R:real; var t:real; MaxIter:integer:=100); // - // t - ; - // R - , R; - // . BPHS, MKSearch () + // Авторская программа. Использует BPHS, MKSearch (косвенно) begin var L1:=new List<(real,array of real)>; @@ -692,7 +692,7 @@ type a1[j]:=false end; var q:=L2.Select(x->x[0]).ToArray.IndexMin; - if L2.Count>1 then Result.Add(L2[q]) // + if L2.Count>1 then Result.Add(L2[q]) // от случайностей end end end; @@ -702,7 +702,7 @@ end; {$region Fraction} type - /// + /// Класс обыкновенных дробей произвольной точности Fraction=class private @@ -715,7 +715,7 @@ type else Result:=(s.Left(16).ToReal,s.Length-16) end; - /// + /// НОД пары чисел class function GCD(a,b:BigInteger):BigInteger; begin while b<>0 do (a,b):=(b,a mod b); @@ -728,7 +728,7 @@ type constructor (num:BigInteger:=0; denom:BigInteger:=1); begin - Assert(denom>0,'Fraction: '); + Assert(denom>0,'Fraction: знаменатель дроби должен быть положительным'); var n:=GCD(num,denom); numerator:=num div n; denominator:=denom div n @@ -927,7 +927,7 @@ type class function operator <>(a:fraction; b:BigInteger):=(a-b).numerator<>0; - /// + /// Обратная величина дроби function Inv:fraction; begin Result:=new fraction; @@ -935,7 +935,7 @@ type Result.denominator:=numerator end; - /// + /// Абсолютная величина дроби function Abs:fraction; begin Result:=new fraction; @@ -965,19 +965,19 @@ type end; - /// + /// Обертка для конструктора класса function Frc(a:BigInteger):fraction; begin Result:=new fraction(a,1); end; - /// + /// Обертка для конструктора класса function Frc(a,b:BigInteger):fraction; begin Result:=new fraction(a,b); end; - /// + /// Обертка для конструктора класса function Frc(a,b,c:BigInteger):fraction; begin Result:=new fraction(b,c); @@ -987,7 +987,7 @@ end; {$region Vector} type - /// + /// В Е К Т О Р Ы Vector=class public @@ -999,7 +999,7 @@ type begin Value:=PABCSystem.Copy(px); Length:=Value.Length; - Assert(Value.Length<>0,'Vector: ') + Assert(Value.Length<>0,'Vector: нулевая длина запрещена') end; constructor (pa,pb:array of real); @@ -1007,7 +1007,7 @@ type Value:=PABCSystem.Copy(pb); Length:=Value.Length; for var i:=0 to Length-1 do Value[i]-=pa[i]; - Assert(Value.Length<>0,'Vector: '); + Assert(Value.Length<>0,'Vector: нулевая длина запрещена'); end; constructor (pn:integer); @@ -1018,25 +1018,25 @@ type class function operator + (va,vb:Vector):Vector; begin - Assert(va.Length=vb.Length,'Vector: '); + Assert(va.Length=vb.Length,'Vector:длины несовместимы'); Result:=new Vector(va.Value.Zip(vb.Value,(p,q)->p+q).ToArray); end; class function operator - (va,vb:Vector):Vector; begin - Assert(va.Length=vb.Length,'Vector: '); + Assert(va.Length=vb.Length,'Vector:длины несовместимы'); Result:=new Vector(va.Value.Zip(vb.Value,(p,q)->p-q).ToArray); end; - class function operator - (va:Vector):Vector; // + class function operator - (va:Vector):Vector; // унарный минус begin Result:=new Vector(va.Value); for var i:=0 to Result.Length-1 do Result.Value[i]:=-Result.Value[i]; end; - class function operator * (va,vb:Vector):real; // + class function operator * (va,vb:Vector):real; // скалярное произведение begin - Assert(va.Length=vb.Length,'Vector: '); + Assert(va.Length=vb.Length,'Vector:длины несовместимы'); Result:=va.Value.Zip(vb.Value,(p,q)->p*q).Sum; end; @@ -1050,7 +1050,7 @@ type class function operator = (va,vb:Vector):boolean; begin - Assert(va.Length=vb.Length,'Vector: '); + Assert(va.Length=vb.Length,'Vector:длины несовместимы'); Result:=(va.Value[0]/vb.Value[0]=1.0); var i:=1; while Result and (i<=va.Length-1) do begin @@ -1059,11 +1059,11 @@ type end end; - /// + /// векторное произведение function VP(vb:Vector):Vector; begin Result:=new Vector(3); - Assert(Length=vb.Length,'Vector.VP: '); + Assert(Length=vb.Length,'Vector.VP: длины векторов несовместимы'); if (Length=2) or (Length=3) then begin var r:=new real[3,3] ((1,1,1),(0,0,0),(0,0,0)); for var j:=0 to Length-1 do begin @@ -1075,16 +1075,16 @@ type Result.Value[2]:=r[1,0]*r[2,1]-r[1,1]*r[2,0] end else begin - Assert(false,'Vector.VP: '); + Assert(false,'Vector.VP: Векторы должны быть двух или трехмерными'); Result.Value:=ArrFill(3,MaxReal) end end; - /// + /// смешанное произведение function MP(vb,vc:Vector):real; begin Assert((Length=vb.Length) or (Length=vc.Length), - 'Vector.MP: '); + 'Vector.MP: длины векторов несовместимы'); if (Length=2) or (Length=3) then begin var r:=new real[3,3]; for var j:=0 to Length-1 do begin @@ -1097,18 +1097,18 @@ type r[0,2]*(r[1,0]*r[2,1]-r[1,1]*r[2,0]) end else begin - Assert(false,'Vector.VP: '); + Assert(false,'Vector.VP: Векторы должны быть двух или трехмерными'); Result:=MaxReal end end; - /// + /// модуль вектора function ModV:real; begin Result:=Sqrt(Value.Select(t->t*t).Sum); end; - /// + /// орт вектора function Ort:Vector; begin Result:=new Vector(Length); @@ -1116,10 +1116,10 @@ type for var i:=0 to Length-1 do Result.Value[i]:=Value[i]*invd end; - /// + /// коллинеарность векторов function IsCollinear(vb:Vector):boolean; begin - Assert(Length=vb.Length,'Vector.IsCollinear: '); + Assert(Length=vb.Length,'Vector.IsCollinear: длины векторов несовместимы'); var k:=Value[0]/vb.Value[0]; Result:=true; var i:=1; @@ -1129,15 +1129,15 @@ type end end; - /// + /// компланарность векторов function IsCoplanar(vb,vc:Vector):boolean; begin Assert((Length=vb.Length) or (Length=vc.Length), - 'Vector.IsCoplanar: '); + 'Vector.IsCoplanar: длины векторов несовместимы'); Result:=Self.MP(vb,vc)=0.0 end; - /// + /// возвращает копию вектора function Copy:Vector; begin Result:=new Vector(Value) @@ -1160,7 +1160,7 @@ end; {$region Matrix} type - /// + /// М А Т Р И Ц Ы Matrix=class public @@ -1188,7 +1188,7 @@ type constructor (nRows,nCols:integer; params pa:array of real); begin Assert(pa.Length=nRows*nCols, - ' MarixR: '); + 'Создание MarixR: Неверное количество параметров'); (RowCount,ColCount):=(nRows,nCols); Value:=new real[RowCount,ColCount]; for var i:=0 to RowCount-1 do @@ -1197,10 +1197,10 @@ type end; class function operator + (pa,pb:Matrix):Matrix; - // + // сложение матриц begin Assert((pa.RowCount=pb.RowCount) and (pa.ColCount=pb.ColCount), - ' MarixR: '); + 'Сложение MarixR: Несовпадение размеров'); Result:=new Matrix(pa.RowCount,pa.RowCount); for var i:=0 to pa.RowCount-1 do for var j:=0 to pa.ColCount-1 do @@ -1208,7 +1208,7 @@ type end; class function operator - (pa:Matrix):Matrix; - // ( ) + // смена знака матрицы (унарный минус) begin Result:=new Matrix(pa.RowCount,pa.ColCount); for var i:=0 to pa.RowCount-1 do @@ -1217,10 +1217,10 @@ type end; class function operator - (pa,pb:Matrix):Matrix; - // + // вычитание матриц begin Assert((pa.RowCount=pb.RowCount) and (pa.ColCount=pb.ColCount), - ' MarixR: '); + 'Вычитание MarixR: Несовпадение размеров'); Result:=new Matrix(pa.RowCount,pa.ColCount); for var i:=0 to pa.RowCount-1 do for var j:=0 to pa.ColCount-1 do @@ -1228,7 +1228,7 @@ type end; class function operator * (r:real; pb:Matrix):Matrix; - // + // умножение скаляра на матрицу begin Result:=new Matrix(pb.RowCount,pb.ColCount); for var i:=0 to pb.RowCount-1 do @@ -1237,13 +1237,13 @@ type end; class function operator * (pa:Matrix; r:real):=r*pa; - // + // умножение матрицы на скаляр class function operator * (pa,pb:Matrix):Matrix; - // + // умножение матриц begin Assert(pa.ColCount=pb.RowCount, - 'Matrix: . '); + 'Matrix: умножение матриц. Несовпадение размеров'); Result:=new Matrix(pa.RowCount,pb.ColCount); for var i:=0 to pa.RowCount-1 do for var j:=0 to pb.ColCount-1 do begin @@ -1255,10 +1255,10 @@ type end; class function operator * (pa:Matrix; pb:Vector):Vector; - // + // умножение матрицы на вектор begin Assert(pa.ColCount=pb.Length, - 'Matrix: . '); + 'Matrix: умножение матрицы на вектор. Несовпадение размеров'); Result:=new Vector(pa.RowCount); for var i:=0 to pa.RowCount-1 do begin var s:=0.0; @@ -1269,10 +1269,10 @@ type end; class function operator * (pa:Vector; pb:Matrix):Vector; - // + // умножение вектора на матрицу begin Assert(pa.Length=pb.RowCount, - 'Matrix: . '); + 'Matrix: умножение вектора на матрицу. Несовпадение размеров'); Result:=new Vector(pb.ColCount); for var j:=0 to pb.ColCount-1 do begin var s:=0.0; @@ -1282,7 +1282,7 @@ type end end; - /// n*n r + /// возвращает диагональную матрицу n*n на базе значения r class function Diag(n:integer; r:real):Matrix; begin Result:=new Matrix(n,n); @@ -1291,7 +1291,7 @@ type Result.Value[i,j]:=i=j?r:0.0 end; - /// + /// выделение строки function Row(k:integer; base:integer:=1):Vector; begin if base<>0 then base:=1; @@ -1299,22 +1299,22 @@ type Result.Value:=Value.Row(k-base) end; - /// + /// замена строки procedure SetRow(v:Vector; k:integer; base:integer:=1); begin if base<>0 then base:=1; Value.SetRow(k-base,v.Value) end; - /// + /// вставка строки послк указанной procedure InsertRowAfter(v:Vector; k:integer; base:integer:=1); begin if base<>0 then base:=1; var k1:=k-base; Assert((k1 >= 0) and (k1 < RowCount), - 'Matrix.InsertRowAfter: '); + 'Matrix.InsertRowAfter: Недопустимый номер строки'); Assert(ColCount=v.Length, - 'Matrix.InsertRowAfter: '); + 'Matrix.InsertRowAfter: Несовместимая длина вектора'); var tm:=new Matrix(RowCount+1,ColCount); for var i:=0 to k1 do for var j:=0 to ColCount-1 do tm.Value[i,j]:=Value[i,j]; @@ -1327,15 +1327,15 @@ type for var j:=0 to ColCount-1 do Value[i,j]:=tm.Value[i,j]; end; - /// + /// вставка строки перед указанной procedure InsertRowBefore(v:Vector; k:integer; base:integer:=1); begin if base<>0 then base:=1; var k1:=k-base; Assert((k1 >= 0) and (k1 < RowCount), - 'Matrix.InsertRowBefore: '); + 'Matrix.InsertRowBefore: Недопустимый номер строки'); Assert(ColCount=v.Length, - 'Matrix.InsertRowBefore: '); + 'Matrix.InsertRowBefore: Несовместимая длина вектора'); var tm:=new Matrix(RowCount+1,ColCount); for var i:=0 to k1-1 do for var j:=0 to ColCount-1 do tm.Value[i,j]:=Value[i,j]; @@ -1348,13 +1348,13 @@ type for var j:=0 to ColCount-1 do Value[i,j]:=tm.Value[i,j]; end; - /// + /// удаление строки procedure DeleteRow(k:integer; base:integer:=1); begin if base<>0 then base:=1; var k1:=k-base; Assert((k1 >= 0) and (k1 < RowCount), - 'Matrix.DeleteRowAfter: '); + 'Matrix.DeleteRowAfter: Недопустимый номер строки'); var tm:=new Matrix(RowCount-1,ColCount); for var i:=0 to k1-1 do for var j:=0 to ColCount-1 do tm.Value[i,j]:=Value[i,j]; @@ -1366,7 +1366,7 @@ type for var j:=0 to ColCount-1 do Value[i,j]:=tm.Value[i,j]; end; - /// j- i-, i- + /// Суммирование j-й строки с i-й, результат в i-й строке procedure AddRow(i,j:integer; base:integer:=1); begin if base<>0 then base:=1; @@ -1374,7 +1374,7 @@ type Value[i-base,k]+=Value[j-base,k] end; - /// j- i-, i- + /// Вычитание j-й строки из i-й, результат в i-й строке procedure SubRow(i,j:integer; base:integer:=1); begin if base<>0 then base:=1; @@ -1382,7 +1382,7 @@ type Value[i-base,k]-=Value[j-base,k] end; - /// + /// Умножение строки на скаляр procedure MultRow(k:integer; r:real; base:integer:=1); begin if base<>0 then base:=1; @@ -1390,14 +1390,14 @@ type Value[k-base,j]*=r end; - /// i j + /// Обмен местами строк i и j procedure SwapRows(i,j:integer; base:integer:=1); begin if base<>0 then base:=1; Value.SwapRows(i-base,j-base) end; - /// + /// выделение столбца function Col(k:integer; base:integer:=1):Vector; begin if base<>0 then base:=1; @@ -1405,22 +1405,22 @@ type Result.Value:=Value.Col(k-base) end; - /// + /// замена столбца procedure SetCol(v:Vector; k:integer; base:integer:=1); begin if base<>0 then base:=1; Value.SetCol(k-base,v.Value) end; - /// + /// вставка столбца послк указанного procedure InsertColAfter(v:Vector; k:integer; base:integer:=1); begin if base<>0 then base:=1; var k1:=k-base; Assert((k1 >= 0) and (k1 < ColCount), - 'Matrix.InsertColAfter: '); + 'Matrix.InsertColAfter: Недопустимый номер столбца'); Assert(RowCount=v.Length, - 'Matrix.InsertColAfter: '); + 'Matrix.InsertColAfter: Несовместимая длина вектора'); var tm:=new Matrix(RowCount,ColCount+1); for var j:=0 to k1 do for var i:=0 to RowCount-1 do tm.Value[i,j]:=Value[i,j]; @@ -1433,15 +1433,15 @@ type for var j:=0 to ColCount-1 do Value[i,j]:=tm.Value[i,j]; end; - /// + /// вставка столбца перед указанным procedure InsertColBefore(v:Vector; k:integer; base:integer:=1); begin if base<>0 then base:=1; var k1:=k-base; Assert((k1 >= 0) and (k1 < ColCount), - 'Matrix.InsertColBefore: '); + 'Matrix.InsertColBefore: Недопустимый номер столбца'); Assert(RowCount=v.Length, - 'Matrix.InsertColBefore: '); + 'Matrix.InsertColBefore: Несовместимая длина вектора'); var tm:=new Matrix(RowCount,ColCount+1); for var j:=0 to k1-1 do for var i:=0 to RowCount-1 do tm.Value[i,j]:=Value[i,j]; @@ -1454,13 +1454,13 @@ type for var j:=0 to ColCount-1 do Value[i,j]:=tm.Value[i,j]; end; - /// + /// удаление столбца procedure DeleteCol(k:integer; base:integer:=1); begin if base<>0 then base:=1; var k1:=k-base; Assert((k1 >= 0) and (k1 < ColCount), - 'Matrix.DeleteCol: '); + 'Matrix.DeleteCol: Недопустимый номер столбца'); var tm:=new Matrix(RowCount,ColCount-1); for var j:=0 to k1-1 do for var i:=0 to RowCount-1 do tm.Value[i,j]:=Value[i,j]; @@ -1472,7 +1472,7 @@ type for var j:=0 to ColCount-1 do Value[i,j]:=tm.Value[i,j]; end; - /// j- i-, i- + /// Суммирование j-го столбца с i-м, результат в i-м столбце procedure AddCol(i,j:integer; base:integer:=1); begin if base<>0 then base:=1; @@ -1480,7 +1480,7 @@ type Value[k,i-base]+=Value[k,j-base] end; - /// j- i-, i- + /// Вычитание j-го столбца из i-го, результат в i-м столбце procedure SubCol(i,j:integer; base:integer:=1); begin if base<>0 then base:=1; @@ -1488,7 +1488,7 @@ type Value[k,i-base]-=Value[k,j-base] end; - /// + /// Умножение столбца на скаляр procedure MultCol(k:integer; r:real; base:integer:=1); begin if base<>0 then base:=1; @@ -1496,21 +1496,21 @@ type Value[i,k-base]*=r end; - /// i j + /// Обмен местами столбцов i и j procedure SwapCols(i,j:integer; base:integer:=1); begin if base<>0 then base:=1; Value.SwapCols(i-base,j-base) end; - /// + /// Транспонирование матрицы function Transpose:Matrix; begin Result:=new Matrix(ColCount,RowCount); Result.Value:=PABCSystem.Transpose(Value); end; - /// + /// вывод матрицы на экран function Println(w:integer:=6; d:integer:=2):Matrix; begin Result:=new Matrix(RowCount,ColCount); @@ -1523,17 +1523,17 @@ type end end; - /// + /// детерминант матрицы function Det:real; begin var r:=new Decomp(Value); Result:=r.det end; - /// + /// обращение квадратной матрицы function Inv:Matrix; begin - Assert(RowCount=ColCount,'Matrix.Inv: '); + Assert(RowCount=ColCount,'Matrix.Inv: матрица не квадратная'); Result:=new Matrix(RowCount,ColCount); var r:=new Decomp(Value); if r.cond1 then begin // + if mflag<>1 then begin // обход части кода при первом обращении if (t=tout) and (kflag<>3) then begin flag:=8; FlagDev; Exit end; @@ -2384,8 +2384,8 @@ type end end; flag_save:=flag; kflag:=0; - relerr_save:=relerr; abserr_save:=abserr; // - relerr_min:=2.0*epsilon+remin; // + relerr_save:=relerr; abserr_save:=abserr; // для будущих проверок + relerr_min:=2.0*epsilon+remin; // ограниечение по точности if relerr; @@ -2530,23 +2530,23 @@ end; {$region Spline} type - /// + /// Интерполяция табличной функции кубическим сплайном Spline=class private - n:integer; // - aK:array[,] of real; // - P:array of Point; // + n:integer; // количество узлов интерполяции + aK:array[,] of real; // коэффициенты сплайна + P:array of Point; // узлы интерполяции - ///- ( ) + ///- Построение сплайна (вызывается конструктором) procedure Spline; // - // Spline . - // -, - // . ., ., . - // " ", - // ., "", 1980. + // Функция Spline возвращает коэффициенты сплайна в массиве. + // Является результатом переработки фортран-программы, + // приведенной в кн. Дж.Форсайт, М.Малькольм, К.Моулер + // "Машинные методы математических вычислений", + // М., "Мир", 1980. // begin if n<2 then Exit; @@ -2599,11 +2599,11 @@ type Spline; end; - /// - /// + /// Вычисление значения построенного + /// конструктором сплайна в заданной точке function Value(u:real):real; // - // Seval) + // портированная с фортрана функция Seval) begin var i,j:integer; if ureal:=x->(x=0?0.0:x<0?-1.0:1.0); diff --git a/bin/Lib/RobotTaskMaker.pas b/bin/Lib/RobotTaskMaker.pas index 333e093b0..a214f2c4b 100644 --- a/bin/Lib/RobotTaskMaker.pas +++ b/bin/Lib/RobotTaskMaker.pas @@ -1,4 +1,4 @@ -// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) unit RobotTaskMaker; diff --git a/bin/Lib/Sockets.pas b/bin/Lib/Sockets.pas index 641eb99e3..ccb19c638 100644 --- a/bin/Lib/Sockets.pas +++ b/bin/Lib/Sockets.pas @@ -1,4 +1,4 @@ -// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) unit Sockets;