Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108

Интерполяция данных ряда в выбранные точки с определенным шагом

25.02.2020, 12:25. Показов 1169. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте!
нужна небольшая помощь.
Есть данные которые(ряды) которые нужно интерполировать.
Почитал, можно интерполировать значения в промежуточные узлы.
Но необходимо сделать интерполяцию в определеннные точки, и с одним шагом.
Как пример данные
уровень 2 , 3, 5, 6, 9 , 11, 15.6, 19, 20.5
значение 15 14 13.4 12 10 9.8 8 7.8 6.2
а нужно чтоб было уровень 0 в него войдет 2 значения. Уровень 2 и 3(сответствено среднее ((15+14)/2) )
затем уровень 10, поотом 20 и т.д
то есть шаг 10

будет двай файла входных: файл уровней и файл значений.
В этих файлах не всегда есть данные по порядку
так например может быть 2, 3, 5, 7, 29, 50, 100, 150,
или 2, 100, 110, 16, 156,
т.д
Тогда все равно, нужно привести к одному виду
То есть в независемости если там данные чтоб сетка была регулярная, а отсутствие данных забитьь например 9999
Для примера приведены сами файлы
он аналогичны по названию, лишь отличаются одной буквой.
Заранее всем спасибо, кто откликнится, и направит в нужное русло.

Пример данных

можно наверное боле грубо метом ближайшего соседа например.
в Дельфи бы так
Сначала обнулить
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 pr2:=0;
                nn:=0;
               Далее // интерполяция и суммирование за месяц
        взять первй уровень     if pr2=1 then
                            ct1:=0; h:=0; // на поверхности
    пара значений          tv:=R1[1];tn:=R1[2];
     и уровней                hv:=H1[1];hn:=H1[2];
      проверка         if (hn<9998) and (hv<9999)and (tv<9998) and (tn<9999) and (hn<>hv) then
                 
                  еслиif    hn-ct1=0 then  rs:=tn
                 иначе если, то решаемelse  rs:=(tv-tn)/(hn-hv)*(hn-ct1)+tn;
                 
                  
                    r[mes2,lat2,lon2,h]:=r[mes2,lat2,lon2,h]+rs;
                    nr[mes2,lat2,lon2,h]:=nr[mes2,lat2,lon2,h]+1;
                  end;
                 end;
              for h:=1 to 160 do
               begin
          перевод       ct1:=h*10; //стандартная глубина в метрах
То есть берем два ближайших значения , в первом случае они идут в нулевой уровень, а с первого уровня дале все также повторяется, но то что более первого уровення попадает в первый ( если не относится ко втрому), что меньше первого в нулевой идет..и так до конца ряда.
Вложения
Тип файла: txt P20030101_prof.nc.txt (13.0 Кб, 8 просмотров)
Тип файла: txt T20030101_prof.nc.txt (13.0 Кб, 4 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.02.2020, 12:25
Ответы с готовыми решениями:

Интерполяция c переменным шагом
Добрый день Уважаемые Форумчане. Было получено задание на практике следующего вида. Графики сигнала /\/\/\ и |\|\|\. Даны значения...

Написать цикл с определённым шагом
Всем привет. Подскажите, есть счетчик - объявляется переменная-счетчик i и увеличивается до 9 по 1 за каждую итерацию: for (var 20 = 0;...

Суммирование ячеек с определенным шагом
Доброе утро! Подскажите пожалуйста на моем примере. Из листа1 суммирую столбцы, например (C3:C16), далее (С17:C30), т.е. с...

7
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
25.02.2020, 15:11
Очень тяжело понимать задание. Может есть какие-то картинки? Схемы?
0
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
26.02.2020, 14:46  [ТС]
46.13 -30.78 508.00 4.00 9.00 19.00 29.00 39.00 49.00 59.00 69.00

1ые цифры не читаем. 46.13 и -30.78 координаты, а 508 это количество значений в строке



Итак читает с 4 ой позиции,это уровни 4,9,19,29,39 и т.д. Необходимо сделать интерполяцию в промежуточные уровни. Это чтобы сделать стандартные уровни.

Таким образом, необходимо сначала получить промежуточные уровни с шагом 1. Для примера показано ниже , только часть , на интервале до 9, то есть первые два значения из строки сверху 4.00 и 9.00

46.13 -30.78 508.00 0 1 2 3 4 5 6 7 8 9


Также во втором файле
46.13 -30.78 508.00 4 9 19.00 29.00 39.00 49.00 59.00 69.00 79.00 90.00
46.13 -30.78 508.00 16 15.22 15.23 15.23 15.23 15.23 15.23 15.22 15.21 15.23

Аналогично координаты и количество 508

также проэкстраполировать в промежуточные уровни
как вариант берем два уровня 4 и 9
в них значения 16 и 15.22 то есть изменение на 5 метров 0.78 делим на 5 и получаем изменение в 1 метр(0.156)
далее отсчитываем влево до уровня 0 все значения
а далее так и до 9
таким образом на 1 метр приходится изменение 0.156

46.13 -30.78 508 0 1 2 3 4 5 6 7 8 9
16.468+0.156 16.312+0.156 16.156+0.156 16+0.156 16 16-0.156 15.22
16.624 16.468 16.312 16.156 15.844


далее между 9 и 19 уровнем изменение 0.01 будет почти прямая
таким образом весь ряд
а потом получить только значения на стандартных уровнях
Пока пробую через 10 шаг
Вложения
Тип файла: xlsx интерполяция.xlsx (12.8 Кб, 3 просмотров)
0
117 / 83 / 39
Регистрация: 06.01.2013
Сообщений: 274
26.02.2020, 16:00
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
clc; close all; clear
 
LEVEL = [6.13 -30.78 508.00 4 9 19.00 29.00 39.00 49.00 59.00 69.00 79.00 90.00];
DATA = [46.13 -30.78 508.00 16 15.22 15.23 15.23 15.23 15.23 15.23 15.22 15.21 15.23];
 
Data = DATA(4:end);
Level = LEVEL(4:end);
Level_int = [0:10 20:10:90];
Data_int = interp1(Level,Data,Level_int,'linear','extrap');
 
plot(Level,Data,'x')
hold on; grid on
plot(Level_int,Data_int,'-o')
1
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
26.02.2020, 16:11
Вот Вам 3 варианта интерполяции
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
clear all; clc; close all;
 
x=[4 9 19.00 29.00 39.00 49.00 59.00 69.00 79.00 90.00];
y=[16 15.22 15.23 15.23 15.23 15.23 15.23 15.22 15.21 15.23];
pp = spline(x,y);
 
xR=1:100;
yR=ppval(pp,xR);
plot(x,y,'ro',xR,yR,'b');
grid on
 
yR2=interp1(x,y,xR); 
figure
plot(x,y,'ro',xR,yR2,'b');
grid on
 
yR2=pchip(x,y,xR); 
figure
plot(x,y,'ro',xR,yR2,'b');
grid on
Однако при интерполяции на участках вне зоны определения надо быть аккуратным и возможно необходимо прописывать исключения
1
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
27.02.2020, 16:03  [ТС]
Сергей Тетьора,
Я пробовал такие варианты ранее
выдавало ошибку
Error using griddedInterpolant
The grid vectors are not strictly monotonic increasing.

Error in interp1 (line 186)
F = griddedInterpolant(X,V,method);

Добавлено через 50 секунд
SSC,
Да
Однако при интерполяции на участках вне зоны определения надо быть аккуратным и возможно необходимо прописывать исключения
иногда в этом кроется проблема.

SSC,
Когда вектор, получается я ранее пробовал, был рабочий код, но с матрицей не получается. Во вложении два файла.
Делал свою интерполяцию, не встроенными функциями, там тоже свои недостатки, то деление на ноль иногда можно попустить....
а Как Вы предложили делал обычную линейную интерполяцию, на тех данных которых апробировал результат, получалось удовлетворительно. ....
На одном векторе
А дальше не удается, когда работа с крупным массивом.
Отдельно вопрос как раз об ошибках, данные которые я сам получаю, я могу знать какие там могут быть ошибки и их исключаю...
А те данные которые я беру с ошибками, нужно делать условия.
Вот например строка
0 1060 9999 40 9999 9999 9999 1403
9999 я могу заменить
а вот выпало после 0 значение 1060, затем 9999 и 40
то есть 1060 вполне нормально число , если бы оно было бы как минимум после 40 ......90...200...600.....1000...1060
тогда было бы нормально, , но в начале оно быть не может
и в соответсвиии этого уровня соответсвенно и сами значения будут не верными

Векторы сетки не являются строго монотонными возрастающими.
Вылетает такая ошибка.
Это если работаю не с вектором, а с матрицей.

Только с массивом не получается.
Во первых ошибка, что данные не монотонные.
Это решить наверно задав пределы какие-то, либо просто убирать выборсы в данных.

Интреполяция только вектора одного да удается, я это делал изначально. Ономерну.ю интеропляцию я ранее делал, Так как нужно было для единичных случаев.
А теперь вывожу не единичные вектора на выходе, а небольшие массивы, по 50-100 строк.

А нужно то именнно для массива проводить эту процедуру. Поэтому и создал тему.
Вложения
Тип файла: rar 05.rar (10.6 Кб, 2 просмотров)
0
117 / 83 / 39
Регистрация: 06.01.2013
Сообщений: 274
05.03.2020, 13:06
Sayres, не очень понимаю, что Вы хотите получить. Если Ваш массив это набор отдельных векторов, то можно интерполировать в цикле.

Вот что у меня получилось:
Matlab M
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
clear; close all; clc
 
filename = 'P20050501_prof.nc.txt';
formatSpec = '%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', '', 'WhiteSpace', '', 'TextType', 'string',  'ReturnOnError', false);
fclose(fileID);
LEVEL = [dataArray{1:end-1}];
clearvars filename formatSpec fileID dataArray ans;
 
filename = 'T20050501_prof.nc.txt';
formatSpec = '%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%10f%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', '', 'WhiteSpace', '', 'TextType', 'string',  'ReturnOnError', false);
fclose(fileID);
DATA = [dataArray{1:end-1}];
clearvars filename formatSpec fileID dataArray ans;
 
level = LEVEL(:,4:end);
level(level==9999)=nan;
data = DATA(:,4:end);
data(data==9999)=nan;
 
for i = 1:size(level,1)
    cla
    Level_int = [0:10 20:10:roundn(max(level(:)),1)];
    [xq,ia,~] = unique(level(i,~isnan(level(i,:))),'stable');
    yq = data(i,ia);
    Data_int(i,:) = interp1(xq,yq,Level_int,'linear','extrap');
    plot(xq,yq,'x',Level_int,Data_int(i,:),'-o')
    grid on
    getframe
end
1
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
12.03.2020, 13:30  [ТС]
Сергей Тетьора,
Спасибо, за отклик.
Это только по другому немнго делал.
Такие файлы я получал, и filename = 'P20050501_prof.nc.txt'; не использую
Я их выводил для примера. И их испоьзовал дальше.
Это я так , но в цикле добавил, к коду котрый раньше их выводил, чтоб сразу в одном коде читать.
Вопрос не получался именно набор отдельных векторов интерполировать нужно.
так Как Вы написали я могу делать, но именно кажый вектор проинтерполировать не удается.
То есть набор этих векторов представлен массивом, допустим 40-50 штук строк.
У меня удается проинтерполировать их по наибольшему значению, как у вАс показано max(level), сначло было проще просто фиксировано ставил уровень.
Потом просто по следнему значению в векторе.
Так вопрос заключается менно интерполяция каждого вектора, но по последнему значению даннного вектора, а не по последнему значению во всей матрице.
То есть получится не фиксировано интерполяцию для всех векторов до конца, а вектора будут не одиноковой длины
и потм вывести эти все вектора, либо указав в каждом векторе признак, то есть число этих значений
либо если по последнему значению в матрице, то и забить их например 9999

Добавлено через 1 час 39 минут
В общем то загвостка была именно интерполяции кажого вектора отдельно, по значению последнего числа, то есть не по фиксированной длине.
5 8 10 56 100 150 у каждого своя длина 150
5 20 50 100 300 300
6 30 40 90 100 100
то есть интерполяция через 10, но конечной длины вектора реальных значений
а концовку можно забить 9999
в середине значения интерполируются нормально
а в конце если ряд не длинный , допустим 50 уровней, а интерполируется по 150 уровню, получается просто убывающая прямая.
Я думал чтоб без цикла это сделать, но такой функции не нашел.

Сергей Тетьора,
Перебрал сколько вариантов, как лучше сделать, но все равно к этому виду примерно как есть сейчас пришел.
Как Вы мне подсказали, в принципе я сначала так именно и начал делать, потом отказался от этого варианта и делал по кажой строчке интерполяцию не встроенной функцией, а перебирая значения формулой.
Загвостка именно в том, что в том что интерполяция проходит по максимальному элементу одной сточки.
Необходимо чтоб менялся Level_int(i)
Индекс (i) по размеру массива, также как и для Data_int
Или варивант найти
Matlab M
1
maxlev=max(level(1:end,:));
А далее
Matlab M
1
Level_int = [0:10:maxlev(1,1)];
Но не получается не в моем коде.
И если добавить его в Ваш код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2020, 13:30
Помогаю со студенческими работами здесь

Поиск кратчайшего пути из точки А до точки В на шахматной доске шагом коня
Всем привет. Я новичек в программировании. Большую сложность вызвала задача в которой необходимо найти кратчайший путь из точки А до...

Построить массив циклом с определенным шагом
Создать массив X от 0 до Pi с определенным шагом n=0,39. Никак не могу написать программу на маткаде

Значение функции на отрезке с определенным шагом
Вычислить значения функции f(x) на отрезке с шагом h. f(x)=0,5+(sh^2)(x)

Как протянуть формулу с определенным шагом?
Здравствуйте, уважаемые гуру экселя! Помогите пожалуйста решить проблему: есть карточки объектов на листе &quot;24&quot;, по ним суммы...

Вставка значений в строки с определённым шагом
Как сделать такую штуку через макрос: A Строка1 s5 Строка2 7 Строка3 8 Строка4 6 (стало s5) ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru