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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
нужна небольшая помощь.
Есть данные которые(ряды) которые нужно интерполировать.
Почитал, можно интерполировать значения в промежуточные узлы.
Но необходимо сделать интерполяцию в определеннные точки, и с одним шагом.
Как пример данные
уровень 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...

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

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

7
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
25.02.2020, 15:11 2
Очень тяжело понимать задание. Может есть какие-то картинки? Схемы?
0
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
26.02.2020, 14:46  [ТС] 3
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 4
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
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
26.02.2020, 16:11 5
Вот Вам 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  [ТС] 6
Сергей Тетьора,
Я пробовал такие варианты ранее
выдавало ошибку
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 7
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  [ТС] 8
Сергей Тетьора,
Спасибо, за отклик.
Это только по другому немнго делал.
Такие файлы я получал, и 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
12.03.2020, 13:30
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)

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru