![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Помогите не Chartе сгладить график кубическими сплайнами
пример данных: любой рандомный набор чисел. Пришлите пожалуйста код вычисления коэфициентов и построения сплайна. А то две недели уже бьюсь и ваще ноль какие-то загагулины строит. Буду очень длагодарен. Очень надо.!!!!!!!!!! |
#3
|
||||
|
||||
![]() А напиши пожалуйста как коэфициенты вычисляешь и формулу кодом
|
#4
|
||||
|
||||
![]() в исходнике есть же
Код:
class procedure TInterpolator.Interpolate(na:array of TNode); var i, j:integer; A:TMatrix; B:array of extended; begin Done:=false; //Проверка числа узлов N := Length(na) - 1; if N<=2 then begin Raise Exception.Create('Number of nodes must be greater than 3!') at @TInterpolator.Interpolate; Exit; end; SetLength(Nodes, N+1); for i:=0 to N do Nodes[i] := na[i]; SortNodes(); //Формирование тридиагональной матрицы SetLength(A, N+1); for i:=0 to N do begin SetLength(A[i], N+1); for j:=0 to N do A[i, j]:=0; end; A[0, 0] := 1; A[N, N] := 1; SetLength(B, N+1); SetLength(M, N+1); M[0]:=0; M[N]:=0; for i:=1 to N-1 do begin A[i, i-1]:=h(i-1); A[i, i] := 2*(h(i-1) + h(i)); A[i, i+1] := h(i); B[i]:=3*( (f(i+1)-f(i))/h(i) - (f(i)-f(i-1))/h(i-1)); end; //Ищем коэффициенты, решая систему уравнений TSLESolver.TridiagonalShuttle(A, B, M); Done:=true; end; //процедура решения системы линейных уравнений //S-коэффициенты при Х //R-правая часть //X-результат class procedure TSLESolver.TridiagonalShuttle(S:TMatrix; R:array of extended; var X:array of extended); var a, b:array of extended; n,i:integer; begin n := Length(R); SetLength(a, n); SetLength(b, n); A[1]:=-S[0, 1]/S[0, 0]; B[1]:=R[0]/S[0, 0]; for i:=1 to n-2 do begin A[i+1] := -S[i, i+1]/(S[i, i] +S[i, i-1]*a[i]); B[i+1] := (-S[i, i-1]*b[i] + R[i])/(S[i, i] +S[i, i-1]*a[i]); end; x[n-1] := (-S[n-1, n-2]*b[n-1] + R[n-1])/(S[n-1, n-1] +S[n-1, n-2]*a[n-1]); for i:= n-2 downto 0 do x[i] := a[i+1]*x[i+1] + b[i+1]; end; Код:
class function TInterpolator.Spline(x:extended):extended; var i:integer; begin i:=0; //Нахождение номера промежутка while not ((x >= xi(i)) and (x <= xi(i+1))) do if (i+1)<Length(Nodes) then inc(i) else Break; Result := Spline(i, x); end; //Функция кубических сплайнов Эрмита class function TInterpolator.Spline(i:integer; x:extended):extended; begin Result := ( M[i+1]*Power(x - xi(i), 3) + M[i]*Power(xi(i+1) - x, 3))/(3*h(i)) + (f(i+1)/h(i) - M[i+1]*h(i)/3)*(x-xi(i)) + (f(i)/h(i) - M[i]*h(i)/3)*(xi(i+1)-x); end; РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |