Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2012, 16:57
BinguelBinguel BinguelBinguel вне форума
Прохожий
 
Регистрация: 28.10.2011
Сообщения: 10
Репутация: 10
По умолчанию Интерполяция кубическим сплайном (производит неправильный расчет Т_Т).

Помогите разобраться! Большая часть даже ключевых данных не совпадает, на мой взгляд, все из-за неправильно прописанной функции нахождения коэфициента D, но как исправить - я не знаю =(

вот часть кода:

Код:
Function GetH_sp(x0:double):double; // kubi4eskij splain - nahozhdenie 6aga h
begin
  If x0 < X[0] Then Result := (X[1] - X[0]) Else
    If x0 > X[9] Then Result := (X[9] - X[8]) Else
      For I := 0 To 8 Do
        If (x0 > X[i]) and (x0<X[i+1])Then
          Begin
            Result := (X[i] - X[i-1]);
            Break;
          End;
end;

Function GetA_sp(x0:double):double; // kubi4eskij splain - nahozhdenie svobodnogo 4isla A
begin
  If x0 < X[0] Then Result := Y[0] Else
    If x0 > X[9] Then Result := Y[9] Else
      For I := 0 To 8 Do
        If (x0 > X[i]) and (x0<X[i+1])Then
          Begin
            Result := Y[i];
            Break;
          End;
end;

Function GetB_sp(x0:double):double; // kubi4eskij splain - nahozhdenie koeficienta B
begin
  If x0 < X[0] Then Result := (Y[2] - Y[0])/(X[2] - X[0]) Else
    If x0 > X[9] Then Result := (Y[9] - Y[7])/(X[9] - X[7]) Else
      For I := 0 To 8 Do
        If (x0 > X[i]) and (x0<X[i+1])Then
          Begin
            Result := (Y[i+1] - Y[i-1])/(X[i+1] - X[i-1]);
            Break;
          End;
end;

Function GetC_sp(x0:double):double; // kubi4eskij splain - nahozhdenie koeficienta C
Var
h:double;
 begin
 h:= GetH_sp(x0);
  If x0 < X[0] Then Result := (Y[0]+Y[2]-2*Y[1])/(h*h) Else
    If x0 > X[9] Then Result := (Y[7]+Y[9]-2*Y[8])/(h*h) Else
      For I := 0 To 8 Do
        If (x0 > X[i]) and (x0<X[i+1])Then
          Begin
            Result := (Y[i-1]+Y[i+1]-2*Y[i])/(h*h);
            Break;
          End;
end;

Function GetC_2_sp(x0:double):double; // kubi4eskij splain - nahozhdenie koeficienta C[i-1]
Var
h:double;
 begin
 h:= GetH_sp(x0);
  If x0 < X[0] Then Result := (Y[0]+Y[2]-2*Y[1])/(h*h) Else
    If x0 > X[9] Then Result := (Y[7]+Y[9]-2*Y[8])/(h*h) Else
      For I := 0 To 8 Do
        If (x0 > X[i]) and (x0<X[i+1])Then
          Begin
            Result := (Y[i-2]+Y[i]-2*Y[i-1])/(h*h);
            Break;
          End;
end;

Function GetD_sp(x0:double):double; // kubi4eskij splain - nahozhdenie koeficienta D
Var
h,c,c2:double;
 begin
 h:= GetH_sp(x0);
 c:=GetC_sp(x0);
 c2:= GetC_2_sp(x0);
   Result := (c-c2)/h ;
  end;

function Gety0_sp(x0: double): double;
 Var
   a,c,d,b: double;
    begin
      a:= GetA_sp(x0);
      b:=  GetB_sp(x0);
      c:= GetC_sp(x0);
      d:=GetD_sp(x0);
        If x0 < X[0] Then Result := (a+b*(x0-X[0])+(c/2)*(x0-X[0])*(x0-X[0])+(d/6)*(x0-X[0])*(x0-X[0])*(x0-X[0])) Else
           If x0 > X[9] Then Result := (a+b*(x0-X[9])+(c/2)*(x0-X[9])*(x0-X[9])+(d/6)*(x0-X[9])*(x0-X[9])*(x0-X[9])) Else
              For I := 0 To 8 Do
                 If (x0 > X[i]) and (x0<X[i+1])Then
                    Begin
                       Result := (a+b*(x0-X[i])+(c/2)*(x0-X[i])*(x0-X[i])+(d/6)*(x0-X[i])*(x0-X[i])*(x0-X[i]));
                        Break;
                    end;
   end;
Вложения
Тип файла: zip spline.zip (325.8 Кбайт, 14 просмотров)

Последний раз редактировалось BinguelBinguel, 06.04.2012 в 13:05.
Ответить с цитированием
  #2  
Старый 06.04.2012, 13:06
BinguelBinguel BinguelBinguel вне форума
Прохожий
 
Регистрация: 28.10.2011
Сообщения: 10
Репутация: 10
По умолчанию

Добавила в программу график, теперь наглядно видно, где кубический сплайн не совпадает с другими видами интерполяции. А вопрос так и остается открытым!
Ответить с цитированием
  #3  
Старый 06.04.2012, 14:08
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

если дело в GetD, то это функция вызывает:
GetH_sp(x0)
GetC_sp(x0)
GetC_2_sp(x0)
ошибка может быть в любой
если есть цифры этих коэффициентов для какого-нибудь x0 и массивов X,Y(глобальные переменные), то можно легко найти какая из них врёт

Последний раз редактировалось Pyro, 06.04.2012 в 14:11.
Ответить с цитированием
  #4  
Старый 06.04.2012, 15:41
BinguelBinguel BinguelBinguel вне форума
Прохожий
 
Регистрация: 28.10.2011
Сообщения: 10
Репутация: 10
По умолчанию

Проблема в том, что есть такие точки, при которых с=с2, и D автоматом = 0. может неправильно вычисление коефициента С?
Ответить с цитированием
  #5  
Старый 06.04.2012, 15:58
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

может ещё цифры в массивах X,Y не правильные
Ответить с цитированием
  #6  
Старый 06.04.2012, 18:49
BinguelBinguel BinguelBinguel вне форума
Прохожий
 
Регистрация: 28.10.2011
Сообщения: 10
Репутация: 10
По умолчанию

Разобралась с кодом, тема закрыта
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025