Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/50: Рейтинг темы: голосов - 50, средняя оценка - 4.84
1 / 1 / 0
Регистрация: 25.12.2012
Сообщений: 33
1

Интерполяция сплайнами

20.03.2013, 22:29. Показов 10046. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Люди добрые , нужна помощь , препод поставил задачу сделать программу которая будет вычислять интерполяцию сплайнами и стоить график ... но беда в том что я пролежал в больнице всю эту тему, и не чего не понял из того что читал сам

Если есть у кого исходник или может наклепать , да так что бы работало , выручите пожалуйста , иначе капец моей летней сессии , надеюсь кто нибудь да поможет
если кто поможет, отпишитесь тут
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2013, 22:29
Ответы с готовыми решениями:

Аппроксимация кривых сплайнами. Форма В-Сплайнов
Добрый вечер. Необходимо сгладить кривую в форме буквы П с помощью B-Сплайнов. Вот...

субтабулирование функции (интерполяция)
День добрый!!! Хотелось бы увидеть вменяемый аналог на C# или Delphi. Задание приложено к...

Кто делал программу интерполирование кубическими сплайнами?
Киньте исходник у кого есть!

Интерполяция
Задача такова: случайно генерируются фиксированое количество координат X и Y, нужно с помощью...

11
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
22.03.2013, 09:07 2
Интерполяция сплайнами - тема весьма объемная.
Есть готова процедура для сплайнов Эрмита - нужно?

Добавлено через 3 минуты
Да, кстати, еще книжка есть электронная по теме - Шишкин, Плис, Кривые и поверхности на экране компьютера.
0
130 / 54 / 27
Регистрация: 13.03.2013
Сообщений: 162
22.03.2013, 09:19 3
Пыталась недавно объяснить однокурсникам. Копипаста того объяснения.

Возможно, мой алгоритм действий не самый лучший, но так как я расписала его на бумаге, то перенесу и сюда. Может быть поможет разобраться (а может и запутает) Очень рекомендую посмотреть учебник. Там все поподробнее расписано, чем было на уроке и есть пример.

1) Задать массивы X [0..n] и Y [0..n] и записать в них значения точек

2) Массив H [1..n] заполнить значениями по формуле H[i]:=X[i]-X[i-1]

--Ищем коэффициенты C[i]

3) Заполнить матрицу, которую в дальнейшем придется решать методом Гаусса по принципу как на картинке.
Система уравнений вычисляется по формуле:
H[i+1]*C[i+1]+2(H[i]+H[i+1])*C[i]+H[i]*C[i-1]=3*((Y[i+1]-Y[i])/H[i+1]-[Y[i]-Y[i-1])/H[i])
Ох, как она здесь страшно смотрится >.<
Формулы есть в учебнике, если что. 224 страница

_ От i:=1 до n
___От j:=1 до n-1
_____если j=i-1 тогда
_____Матрица[i,j]:=H[i] иначе если j=i тогда
_____Матрица[i,j]:=2*(H[i]+H[i+1]) иначе если j=i+1 тогда
_____Матрица[i,j]:=H[j] иначе
_____Матрица[i,j]:=0

_От i:=1 до n
___Матрица-Столбец[i]:=3*((Y[i+1]-Y[i])/H[i+1]-(Y[i]-Y[i-1])/H[i])

Ну и ответ, полученный методом Гаусса в массив C [0..n]
(C[0] и C[n] должны быть равны 0)

--Теперь проще: ищем коэффициенты D[i]

4) От i:=1 до n
____D[i]:=(C[i]-C[i-1])/3*H[i]

--Коэффициенты B[i]

5) От i:=1 до n
____B[i]:=(Y[i]-Y[i-1])/H[i]+H[i]*C[i]-H[i]*H[i]*D[i]

6) Для построения графика или нахождения переменной нужно определить, попадает ли она в промежуток от Хo до Xn, а также, в какой именно промежуток. Для этого можно ввести переменную k
и присвоить ей для начала значение -1 (это будет индикатором того, что искомая точка не входит в промежуток (Хо; Хn)
k:=-1
_Oт i:=1 до n
____если ((x>=X[i-1]) AND (x<=X[i])) тогда
____k:=i

И тогда значение у от искомого х будет высчитываться по формуле
t:=x-X[k] (просто для удобства, дабы формула была не такой громоздкой)
y:=Y[k]+B[k]*t+C[k]*t*t+D[k]*t*t*t

Поясняющие картинки:
Интерполяция сплайнами

Интерполяция сплайнами


Формулы взяты из учебника "Численные методы" Лапчик, Рагулина, Хеннер

(P.S. Тут синтаксис паскаля, но, надеюсь общий смысл понятен)
0
1 / 1 / 0
Регистрация: 25.12.2012
Сообщений: 33
22.03.2013, 16:18  [ТС] 4
Цитата Сообщение от dondublon Посмотреть сообщение
Есть готова процедура для сплайнов Эрмита - нужно?
Да , не помешало бы .

Добавлено через 37 секунд
Erea, спасибо буду разбираться .
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
22.03.2013, 17:31 5
Цитата Сообщение от Илья_Я Посмотреть сообщение
Да , не помешало бы .
Опоздал.
Этот код у меня на работе, а оттуда я уже ушел. Так что только в понедельник.
0
1 / 1 / 0
Регистрация: 25.12.2012
Сообщений: 33
25.03.2013, 15:57  [ТС] 6
dondublon, Могли бы вы показать то , что не успели показать в пятницу .

Цитата Сообщение от dondublon Посмотреть сообщение
Опоздал.
Этот код у меня на работе, а оттуда я уже ушел. Так что только в понедельник.
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
25.03.2013, 16:14 7
Успел
Значит, так.
Я буду кидать куски кода, потом сам слепишь.
Работает класс TInterpolator1D.
Delphi
1
2
3
4
5
6
constructor TInterpolator1D.CreateErmith( );
begin
 
    FGetValueFunction := GetErmith;
    ResetErmith(Point.Point_Float_Zero, Point_Float_One, 0, 0);
end;
Где ResetErmith создаёт нужные коэффициенты:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TInterpolator1D.ResetErmith(APoint1, APoint2: TPoint_Float;
  ADerivative1, ADerivative2: Double);
begin
    FP1 := APoint1;
    FP2 := APoint2;
    if FP1.x = FP2.x then
        RaiseInvalidValues;
    FK1 := ADerivative1;
    FK2 := ADerivative2;
    CreateErmithCoeffl;
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TInterpolator1D.CreateErmithCoeffl;
var
    z: Double;
    x1, y1, x2, y2, k1, k2: Double;
    function Cube(x: Double): Double; inline;
    begin
        Result := Sqr(x)*x;
    end;
 
begin
    x1 := FP1.x;
    x2 := FP2.x;
    y1 := FP1.y;
    y2 := FP2.y;
    k1 := FK1;
    k2 := FK2;
    Z := Cube(x1 - x2);
    FCoeff.A := (x1*k1-2*y1-x2*k1-x2*k2+x1*k2+2*y2)/Z;
    //((FK1 + FK2) * (FP1.x - Fp2.x ) + 2 * (FP1.y + FP2.y)) / Z;
    FCoeff.B := -(2*Sqr(x1)*k2+Sqr(x1)*k1+3*x1*y2-x1*x2*k2-3*x1*y1+x1*x2*k1-2*sqr(x2)*k1+3*x2*y2-sqr(x2)*k2-3*x2*y1)/Z;
 
    {-( FK1 * (Sqr(Fp1.x) + FP1.x * FP2.x - 2 * Sqr(FP2.x)) +
                FK2 * (2 * Sqr(Fp1.x) - FP1.x * FP2.x - Sqr(FP2.x)) +
                3 * (FP1.x + FP2.x) * (FP2.y - FP1.y) ) / Z;}
 
    FCoeff.C := (Cube(x1)*k2+Sqr(x1)*x2*k2+2*Sqr(x1)*x2*k1-2*Sqr(x2)*x1*k2+6*x1*x2*y2-Sqr(x2)*x1*k1-6*x1*x2*y1-Cube(x2)*k1)/Z;
 
    {( Sqr(Fp1.x) * (Fk2 * (FP1.x + FP2.x) + 2 * FP2.x * FK1)
                  -Sqr(FP2.x)* (FK1 * (FP1.x + FP2.x) + 2 * FP1.x * FK2)
                  + 6 * FP1.x * FP2.x * (FP2.y - FP1.y) ) / Z;}
 
    FCoeff.D := -(-Cube(x1)*y2+Cube(x1)*x2*k2+Sqr(x1)*Sqr(x2)*k1-Sqr(x2)*k2*Sqr(x1)+3*x2*y2*Sqr(x1)-3*Sqr(x2)*y1*x1-x1*Cube(x2)*k1+Cube(x2)*y1)/Z;
 
    {-( 3 * FP1.x * FP2.x * (FP2.y * FP1.x - FP2.x + FP1.y)
                + Fp1.x * FP2.x * (FP1.x - FP2.x) * (FK1 * FP2.x + Fk2 + FP1.x)
                - IntPower(FP1.x, 3) * FP2.y + IntPower(Fp2.x, 3) * FP1.y ) / Z;}
 
    if Abs(GetValueIn(x1) - y1) > 1e-6 then
        Assert(False);
    if Abs(GetValueIn(x2) - y2) > 1e-6 then
        Assert(False);
 
end;
А функция GetErmith получает по ним значение в искомой точке
Delphi
1
2
3
4
5
function TInterpolator1D.GetErmith(APoint: Double): Double;
begin
    result := FCoeff.A * IntPower(APoint, 3) + FCoeff.B * Sqr(APoint) + FCoeff.C * APoint + FCoeff.D;
 
end;
Добавлено через 2 минуты
TPoint_Float - двумерная точка с иском и игреком.
ADerivative1, ADerivative2: Double - производные.

Добавлено через 1 минуту
GetValueIn в нашем случае можно считать GetErmith.
0
1 / 1 / 0
Регистрация: 25.12.2012
Сообщений: 33
25.03.2013, 16:28  [ТС] 8
dondublon, спасибо , начну разбираться !
0
0 / 0 / 0
Регистрация: 14.05.2020
Сообщений: 12
21.05.2020, 13:01 9
Здравствуйте! Где найти класс TInterpolator1D?
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
21.05.2020, 13:44 10
Цитата Сообщение от DimDim Посмотреть сообщение
Где найти класс TInterpolator1D?
А разве из темы не понятно, что этот класс надо писать самому?
0
0 / 0 / 0
Регистрация: 14.05.2020
Сообщений: 12
21.05.2020, 14:40 11
Начиная с Коструктора?
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
21.05.2020, 15:09 12
Нет, начиная с описания класса. Конструктор - не более чем один из методов класса...
1
21.05.2020, 15:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2020, 15:09
Помогаю со студенческими работами здесь

Интерполяция по Ньютону
Привет форумчане, сижу и ламаю голову над Интерполяцией по Ньютону понимаешь ли, и чет ниче не...

Delphi - Аппроксимация. Интерполяция?
1) Есть массив значений в StringGrid1.: (гистограмма) x / F(x) 1 / 0 2 / 5 3 / 12 .... xk /...

Интерполяция многочленом Лагранжа
Вычислить массив значений заданной функции y=f(x) на отрезке с шагом △x=(b-a)/n т.е. задать...

Интерполяция для изображений
Написал простейшую прогу, чтобы увеличить каждое изображение в 2 раза, раскадровывая его. Но. Одна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru