
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.220] |
![]() |
|
Сообщ.
#1
,
|
|
|
Ошибку выдает
procedure APVAdd( VDst: PDouble; I11, I12: AlglibInteger; VSrc: PDouble; I21, I22: AlglibInteger; S: extended);overload; var I, C: LongInt; begin Assert(I12-I11=I22-I21, 'APVAdd: arrays of different size!'); Inc(VDst, I11); Inc(VSrc, I21); // // Generic pascal code // C:=I12-I11; for I:=0 to C do begin VDst^:=VDst^+S*VSrc^; Inc(VDst); Inc(VSrc); end; end; В чем может быть ошибка??? |
Сообщ.
#2
,
|
|
|
При вычмслении получается слишком большое по модулю число, которое не может быть представлено данным форматом.
Добавлено А VDst уже заполнен чем-нибудь? |
Сообщ.
#3
,
|
|
|
Да заполнено. Ошибку выдает когда по второму разу код проходит. Сначала выполняется
while I<=M2 do begin T := V[I+1-M1]; APVAdd(@WORK[0], N1, N2, @C[I][0], N1, N2, T); Inc(I); end; вот когда i=2 тогда выдает ошибку в функции APVAdd. Как можно исправить ошибку??? Код писала не я. Это алгоритм ALGLIB, оттуда взяла SVD(Сингулярного разложения матрицы). Добавлено в первый раз S=1. второй раз S=-2.3645621257e+4596. Можетпроблема в S??? C указателями често говоря раньше не очень то и работала, поэтому сама не могу разобраться в ошибке. Добавлено перед циклом специально обнулила VDst но все равно при втором проходе выдает ошибку. |
Сообщ.
#4
,
|
|
|
Можно попробовать Extended вместо Double, если проблема действительно в разрядности.
Добавлено Цитата ermik_8810 @ второй раз S=-2.3645621257e+4596. Можетпроблема в S??? Это уже почти предел возможности Extended! Самое главное чему будет равен результат умножения и сложения!!! |
Сообщ.
#5
,
|
|
|
поменяла Double на Extended.
Теперь на четвертом проходе выдает "Invalid floating point operator" и опять на этой строчке. |
Сообщ.
#6
,
|
|
|
Видать при таких данных задача не имеет решения.
|
Сообщ.
#7
,
|
|
|
и нечего нельзя поделать???
Добавлено в книжке откуда беру матрицу есть решение, но алгоритм почему то не работает ![]() |
Сообщ.
#8
,
|
|
|
О данном алгоритме я ничего не знаю. Жди специалистов.
Пока перепроверь правильность значений в массиве V[]- а то в нем какие-то большие значения. Попробуй проверить алгоритм на других значениях. |
Сообщ.
#9
,
|
|
|
попробовала взять другой массив, теперь в другом месте и другую ошибку выдает. Видимо проблема в алгоритме(
|
Сообщ.
#10
,
|
|
|
Цитата ermik_8810 @ второй раз S=-2.3645621257e+4596. Можетпроблема в S??? Конечно. И вполне возможно что это просто неинициализированное "мусорное" значение в результате элементарного выхода за диапазон индексов в Цитата ermik_8810 @ while I<=M2 do begin T := V[I+1-M1]; |
Сообщ.
#11
,
|
|
|
проблема наверное в моем коде. так как алгоритм должен работать. может я что то не так сделала. я взяла из ALGLIB модули связанные c SVD и перенесла в папку своей проги, дальше в коде их добавила и вызвала функцию из файла SVD, но почему то при разных матрицах разные ошибки выдает.
Вот мой код. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Math, Ap, hblas, reflections, creflections, sblas, ablasf, ablas, ortfac, blas, rotations, bdsvd; type // treal2darray = array of array of double; TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Label1: TLabel; StringGrid2: TStringGrid; StringGrid3: TStringGrid; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; aa,uu,ww: TReal2DArray; vt:Treal1darray; implementation uses svd; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; begin SetLength(vt,4); SetLength(ww,7,4); SetLength(uu,4,4); RMatrixSVD(aa,7,4,2,2,2,vt,ww,uu); for I := 1 to 7 do for j := 1 to 4 do begin StringGrid1.Cells[j,i]:=FloatToStr(vt[j-1]); StringGrid2.Cells[j,i]:=FloatToStr(ww[i-1,j-1]); StringGrid3.Cells[j,i]:=FloatToStr(uu[i-1,j-1]); end; end; procedure TForm1.FormCreate(Sender: TObject); begin SetLength(aa,7,4); aa[0,0]:=-0.022; aa[0,1]:=0.0745; aa[0,2]:=0.0202; aa[0,3]:=-0.0624; aa[1,0]:=0.0022; aa[1,1]:=-0.0065; aa[1,2]:=0.0319; aa[1,3]:=-0.017; aa[2,0]:=-0.0151; aa[2,1]:=0.0332; aa[2,2]:=-0.003; aa[2,3]:=-0.0062; aa[3,0]:=-0.0117; aa[3,1]:=0.0193; aa[3,2]:=0.0043; aa[3,3]:=-0.0002; aa[4,0]:=0.031; aa[4,1]:=-0.0427; aa[4,2]:=-0.0179; aa[4,3]:=-0.0054; aa[5,0]:=0.0184; aa[5,1]:=-0.0524; aa[5,2]:=-0.0216; aa[5,3]:=0.0407; aa[6,0]:=0.0006; aa[6,1]:=-0.0446; aa[6,2]:=-0.0299; aa[6,3]:=0.077; { aa[0,0]:=1; aa[0,1]:=0; aa[0,2]:=0; aa[0,3]:=0; aa[0,4]:=2; aa[1,0]:=0; aa[1,1]:=0; aa[1,2]:=3; aa[1,3]:=0; aa[1,4]:=0; aa[2,0]:=0; aa[2,1]:=0; aa[2,2]:=0; aa[2,3]:=0; aa[2,4]:=0; aa[3,0]:=0; aa[3,1]:=4; aa[3,2]:=0; aa[3,3]:=0; aa[3,4]:=0;} end; end. |