Ошибки интерполяции, функция plot не генерирует правильные линии при запуске - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь составить график для моей программы интерполяции (в основном она берет тестовую функцию и создает строки, используя interpolation method)

clear all;
close all; 
clc;

x1= [-1 0.75 -0.5 -0.25 0 0.25 0.5 0.75 1];
x2=-1:1001:1;

y1=1./(1+25.*x1.^2);
y2=1./(1+25.*x2.^2);
figure(777)
title('Figure 777')
for loop=1:1:6

    subplot(6,2,loop);
    plot(x2,y2,'linewidth',2);
    hold on
    plot(x1,y1,'r.','markersize',25);
    hold on
end
%%%(A)
[p1,s1,u1] = polyfit(x1,y1,4);
Y1=polyval(p1, x2, s1, u1);
subplot (6,2,1)
plot(x2,Y1,'b','linewidth',6);

%%%(B)
[p2, s2, u2] = polyfit(x1,y1,8);
Y2 = polyval(p2, x2, s2, u2);
subplot(6,2,1)
plot(x2,Y2, 'b', 'linewidth', 6);

%%%(C)
Y3 = interp1(x1, y1, x2, 'linear');
subplot(6,3,1)
plot(x2, Y3, 'b', 'linewidth', 6);

%%%(D)
Y4 = interp1(x1,y1,x2, 'nearest');
subplot(6,4,1)
plot(x2, Y4, 'b', 'linewidth', 6);

%%%(E)
Y5 = interp1(x1,y1,x2, 'spline');
subplot(6,5,1)
plot(x2, Y5, 'b', 'linewidth', 6);

%%%(F)%%%(This method does not exist for Matlab R2017a)
Y6 = interp1(x1,y1,x2, 'makima');
subplot(6,6,1)
plot(x2, Y6, 'b', 'linewidth', 6);

Однако ни одна из строк не появляется при запуске программы. Только точки. Кроме того, я получаю эти ошибки:

Предупреждение: полином плохо кондиционирован. Добавьте точки с различными значениями X или уменьшить степень полинома. В polyfit (line 73) В HwSixTwo (line 27)

Ошибка при использовании griddedInterpolant Векторы сетки должны содержать уникальные точки.

Ошибка в interp1 (строка 149) F = griddedInterpolant(X,V,method);

Ошибка в HwSixTwo (строка 33) Y3 = interp1(x1, y1, x2, 'linear');

1 Ответ

3 голосов
/ 16 апреля 2019

Хорошо, одна ошибка, которая, конечно, не приведет к ожидаемым результатам, находится здесь:

x2=-1:1001:1;

Я предполагаю, что вы намерены создать 1001 точку, равномерно распределенную между -1 и 1. Этот код не делает это. Среднее число указывает, что расстояние между последовательными числами. 1001 не имеет смысла, который генерирует только одно значение, равное -1. ​​

Замените ваш код функцией linspace:

x2 = linspace(-1, 1, 1001);

Кроме того, вы пропускаете знак минуса в одном из ваших значений в x1 - 0,75:

x1= [-1 -0.75 -0.5 -0.25 0 0.25 0.5 0.75 1];
    %    ^^^

Как заметил Крис, ваши x значения должны быть монотонными или увеличиваться / уменьшаться в одном направлении.

...