0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
1

Кусочно-линейная и кусочно-квадратичная интерполяция.

19.06.2013, 19:44. Показов 25923. Ответов 15
Метки faq+ (Все метки)

Author24 — интернет-сервис помощи студентам
помогите, не знаю как сделать квадратичную...(мне нужно без сплайнов)...чтобы вводить только функцию и возможно что то еще я точно не знаю как это должно выглядеть...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2013, 19:44
Ответы с готовыми решениями:

Кусочно-линейная интерполяция
Есть функция, которая отражает принятый сигнал, из сигнала надо убрать шумы, то есть сгладить...

кусочно-заданая функция
Всем привет, не подскажите у меня кусочно-заданая функция x1,x2 =1: 0.01:10; % Задаём три...

кусочно заданная функция
помогите записать примерв мат лабе

Кусочно-заданная функция
Помогите вычислить и построить график 3sinx-cos^2x,x<=0 3sqrt(1+x^4/log(x+5)),x>0

15
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
19.06.2013, 19:56 2
Уточню: имеется ввиду апроксимация многочленом второй степени?
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
19.06.2013, 20:07  [ТС] 3
без понятия что ты сказал.
все что мне сказали это надо :"линейная и квадратичная интерполяция"
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
19.06.2013, 20:17 4
В матлабе есть встроенная функция polyfit, которая апроксимирует данные многочленом указанной степени, т.е. для квадратичной функции степень равна 2, тогда:
p = polyfit(x,y, 2) % рассчет коэфф-тов многочлена
yn = polyval(p, x) % рассчет новых точек

Если встроенная функция не подходит, то можно написать ручной метод наименьших квадратов (теорию взять отсюда:
http://helpstat.ru/2012/01/met... kvadratov/ )

Входными данными являются два вектора координат x, y и функция, которой аппроксимируем эти точки.

Добавлено через 7 минут
Пример линейной апроксимации методом наименьших квадратов можно посмотреть тут:
Метод наименьших квадратов для линейной функции
Квадратичная будет похожа, но надо подправить.

*кстать в матлабе также есть фукция апроксимации МНК произвольной функцией lsqcurvefit
( пример здеся: по экспериментальным данным необходимо подобрать функциональную зависимость заданного вида с использованием встроенной функции lsqcurvefit. )
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
19.06.2013, 21:26  [ТС] 5
ладно спасибо.может разберусь.....просто курсач надо до завтра сделать...а я не знаю как сделать квадратичную...
вот для линейной лучше эту использовать
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
N=3;
i=1:N;
dx=2*pi/(N-1);
x(i)=dx*(i-1);
y=sin(x)
 
M = 1000;
for j=1:M;
    dt=2*pi/(M-1);
    X(j)=dt*(j-1);
end
 
Y=interp1(x,y,X);
plot(x,y, 'o',X,Y);
или эту
Matlab M
1
2
3
4
5
x = 0:10; 
y = sin(x); 
xi = 0:.25:10; 
yi = interp1(x,y,xi); 
plot(x,y,'o',xi,yi)
?
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
19.06.2013, 21:37 6
Второй вариант больше нравится

А я набросал метод наименьших квадратов для квадратичной функции
Кликните здесь для просмотра всего текста
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
clc
clear
 
% рассчитываем точки данных
x = 0:0.2:3;
y = sin(x);
 
% делаем метод наименьших квадратов
N = length(x);
Mx  = sum(x);
Mx2 = sum(x.^2);
Mx3 = sum(x.^3);
Mx4 = sum(x.^4);
My  = sum(y);
Mxy = sum(x.*y);
Mx2y = sum(x.^2.*y);
 
A = [Mx2 Mx N
    Mx3 Mx2 Mx
    Mx4 Mx3 Mx2];
 
B = [My; Mxy; Mx2y];
X=A\B;
 
% коэф-ты параболы
X' 
 
% рассчитываем результирующую прямую
x2 = linspace(min(x),max(x),200);
y2 = polyval(X, x2);
plot(x,y,'or',x2,y2,'b'); 
grid on;
legend('Исходные данные','метод наименьших квадратов');
Кусочно-линейная и кусочно-квадратичная интерполяция.

Но похоже я ошибся в самом начале, тебе не метод наименьших квадратов нужен, а что-то другое
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
19.06.2013, 21:43  [ТС] 7
тоесть смысла нет мне смотреть метод наименьших квадратов?ну я искал в интернете кв интерполяцию...но там есть только математически выводиться а это переделать в код шишь знает как...а квадратичную сплайнами мне запретили(но ей в сто раз проше...покрайнемере у нее есть своя функция в матлабе)...вот и думаю как что сделать по другому....
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
19.06.2013, 21:59 8
Смысл есть по крайней мере, если ничего не придумаем, то будет хоть это.

Добавлено через 13 минут
Вообще, если посмотреть картинку алгоритма:
https://www.cyberforum.ru/post3195688.html
то становится ясно, что имеем дело с "кусочно-квадратичной интерполяцией"
Я с нею не знаком единственное, есть програмка на Си: Вычислить приближённое значение функции с помощью кусочно-квадратичной интерполяции
1
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
19.06.2013, 23:28 9
Хе посмотрел статейку: http://univer-nn.ru/articles/kvadrat_interpol.php
И вот что набросал:
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
clc
clear
 
% рассчитываем точки данных
x = 0:0.5:5;
y = x + sin(x);
 
dxi = 0.05; % новый мелкий шаг х
 
for i = 1:length(x)-2
    % составляем систему по трем точкам
    A = [x(i)^2 x(i) 1 
         x(i+1)^2 x(i+1) 1
         x(i+2)^2 x(i+2) 1];
    B = [y(i); y(i+1); y(i+2)];
    p(:,i) = A\B; % решаем систему
    t(:,i) = x(i):dxi:x(i+2);
    f(:,i) = polyval(p(:,i), t(:,i));
end
% рисуем график
plot(x,y,'or', t,f)
grid on;
legend('Исходные данные','кусочно-квадратичная интерполяция',2);
График:

Кусочно-линейная и кусочно-квадратичная интерполяция.


Алгоритм такой: мы последовательно берем по три точки, считаем для них коэфф-ты параболы (квадратичный многочлен), по этим коэфф-там считаем промежуточные значения (это и есть интерполяция) на этом участке, идем к следующей тройке точек и так, пока точки не кончатся
2
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
19.06.2013, 23:32 10
*кстать, значения коэфф-тов на каждом участке сохрfняется в столбцах матрицы p, поэтому после цикла с ними можно работать!

Добавлено через 2 минуты
А вот кусочно-линейная (чуток подправил строки 12-15):
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
clc
clear
 
% рассчитываем точки данных
x = 0:0.5:5;
y = x + sin(x);
 
dxi = 0.05; % новый мелкий шаг х
 
for i = 1:length(x)-1
    % составляем систему по двум точкам
    A = [x(i) 1 
         x(i+1) 1];
 
    B = [y(i); y(i+1)];
    p(:,i) = A\B; % решаем систему
    t(:,i) = x(i):dxi:x(i+1);
    f(:,i) = polyval(p(:,i), t(:,i));
end
% рисуем график
plot(x,y,'or', t,f)
grid on;
legend('Исходные данные','кусочно-квадратичная интерполяция',2);
2
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
20.06.2013, 00:46  [ТС] 11
Добавлено через 9 минут
Зосима, а зачем нужен новый мелкий шаг?(тоесть 2 проги это уже и есть линейная и квадратичная интерполяции?)
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
20.06.2013, 06:32 12
Мелкий шаг нужен для расчета значений между точками данных! Это и есть интерполяция

Да, программки готовые. Остается подставлять свои точки данных x, y
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
20.06.2013, 21:28  [ТС] 13
Зосима, мне преподаватель сказал что нужно сделать без polyval ....и кстати квадратичную он почемуто странно строит к примеру тангенс он 2 графика выводит...(2 линии).не знаешь как можно сделать?
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
21.06.2013, 09:59 14
polyval можно заменить, а вот с несколькими кривыми - это особеность метода: мы расматриваем три точки, т.е. два отрезка, а когда сдвигаемся на одну точку, то второй отрезок тарой кривой попадает на первый отрезок новой и они не совпадают. Чтобы избавиться от неоднозначности я эти участки усреднил (сложил и поделил на 2):
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
34
35
36
37
clc
clear
 
% рассчитываем точки данных
x = 0:0.5:5;
y = tan(x);
 
dxi = 0.05; % новый мелкий шаг х
% рисуем график
plot(x,y,'or')
grid on;
hold on
for i = 1:length(x)-2
    % составляем систему по трем точкам
    A = [x(i)^2 x(i) 1 
         x(i+1)^2 x(i+1) 1
         x(i+2)^2 x(i+2) 1];
    B = [y(i); y(i+1); y(i+2)];
    p = A\B; % решаем систему
    t1 = x(i):dxi:x(i+1);
    t2 = x(i+1):dxi:x(i+2);
    if i==1 
        f1 = p'*[t1.^2; t1; t1./t1];
        f2 = p'*[t2.^2; t2; t2./t2];
        plot(t1,f1)
    else
        f1 = (f2 + p(1)*t1.^2 + p(2)*t1 + p(3) )/2; % средне
        f2 = p(1)*t2.^2 + p(2)*t2 + p(3);
        if i==length(x)-2
            plot([t1,t2],[f1,f2])
        else
            plot(t1,f1)
        end
    end    
end
 
legend('Исходные данные','интерполяция');
2
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 10
21.06.2013, 15:33  [ТС] 15
@Зосима, а чтоб для линейной сделать без той функции что нужно исправить в листинге?
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
25.06.2013, 14:12 16
линейную можно сделать влоб
Matlab M
1
f(:,i) = p(1,i)*t(:,i) + p(2,i);
еще бы знать что обозначают эти строчки программы...по сути от A=... и до конца
Гляди A и B сидели на трубе - это матрица коэффициентов и вектор правой части системы уравнений. Шо за система?
Мы хотим сделать линейную интерполяцию, т.е. рассчитать уравнение прямой y = a*x + b, соединяющей две точки ( x(i),y(i) ) и ( x(i+1),y(i+1) ). А для этого должна выполняться система уравнений:
a*x(i) + b = y(i) и
a*x(i+1) + b = y(i+1)

Нам надо узнать коэфф-ты a и b. Для этого мы составляем матрицу коэфф-тов A (сравнивай систему и матрицу):
[ x(i), 1;
x(i+1), 1]
Замечаешь сходство?

А вектор правой части B равен (смотри на систему):
[y(i);
y(i+1)]

Затем мы решаем систему:
p = A\B и получаем вектор, в котором p(1) - это коэфф-т a, а p(2) - это b, тогда уравнение прямой получается:
f = p(1)*t + p(2).

Единственное, что: на каждом отрезке будет своя прямая и своя пара коэф-тов, поэтому я каждую из этих пар p, (а также промежуточные точки t и значение функции в этих точках f) я сохраняю в свой i-ый столбец:
p(:,i), f(:,i), t(:,i)
А потом рисовалка plot вырисовывает каждый столбец полученных матриц f, t, так что каждый столбец t соответствует своему столбцу f и мы получаем множество прямых! =)

В квадратичной ход решения аналогичный, только парабола y=a*x^2+b*x+c имеет три коэфф-та: a,b,c, поэтому нужна система из трех уравнений, поэтому рассматриваем три точки.

Но три точки образуют два отрезка... и тут выходит накладка: когда мы сдвигаемся на 1 точку, то второй отрезок старой параболы не совпадает с первым отрезком новой параболы! Как быть? Если честно - точно не знаю. Я решил взять среднее арифметическое (половину суммы f1 и f2, а еще можно взять среднегеометрическое: корень из произведения)
Правда самый первый отрезок при i=1 усреднять не с чем, поэтому в первом условии я его просто считаю и не усредняю. А в остальных - усредняю f1 с предыдущим f2.
Потом я рисую только первый (усредненный) отрезок t1, f1.
Но в этом случае самый последний отрезок не прорисуется, для этого служит последнее условие i==length(x)-2, в котором мы прорисовываем оставшийся кусочек.

Ясненько?


PS: как выяснилось коэфф-ты прямой и параболы можно считать по известным формулам:
Matlab M
1
2
3
4
5
6
7
8
9
% y = a*x + b
a = (y(i+1)-y(i))/(x(i+1)-x(i));
b = y(i) - a*x(i);
 
% y = a*x.^2 + b*x + c
a = ( (y(i+2) - y(i))*(x(i+1) - x(i)) - (y(i+1) - y(i))*(x(i+2) - x(i)) ) /...
     ( (x(i+2)^2 - x(i)^2)*(x(i+1) - x(i)) - (x(i+1)^2 - x(i)^2)*(x(i+2) - x(i)) );
b = (y(i+1) - y(i) - a*(x(i+1)^2 - x(i)^2)) / (x(i+1) - x(i));
c = y(i) - (a*x(i)^2 + b*x(i));
0
25.06.2013, 14:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 14:12
Помогаю со студенческими работами здесь

Построение кусочно-заданной функции
Добрый вечер, мне необходимо написать программу которая строит график кусочно заданной функции...

График кусочно-заданной функции
Построить график кусочно-заданной функции, отобразить ветви разными цветами и маркерами. я пишу...

Работа с кусочно-непрерывной функцией
Всем доброго времени суток. По учёбе явилась необходимость работы с Matlab. Конкретно от меня...

Построить график кусочно-линейной функции
Доброго времени суток! Необходимо построить график используя условные операторы. Похоже, что я не...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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