Загрузка данных


% ЛБ1, часть 1, Вариант 5 (без локальных функций)
clear; clc; close all;

%% ================= ЗАДАЧА 1 =================
x  = [10.2 10.4 10.6 10.8 11.0];   % Sol
y  = [90 20 0 45 84];              % T, град C
xq = 10.5;                         % марсианский полдень

%% 1.1 Геометрическое представление табулированной функции
figure(1);
subplot(2,2,1); plot(x, y, 'ro-', 'LineWidth', 1.5, 'MarkerSize', 8); grid on;
xlabel('Sol'); ylabel('T, ^\circC'); title('plot(x,y)');
subplot(2,2,2); bar(x, y, 0.6); grid on;
xlabel('Sol'); ylabel('T, ^\circC'); title('bar(x,y)');
subplot(2,2,3); line(x, y, 'LineWidth', 1.5, 'Color', 'b'); grid on;
xlabel('Sol'); ylabel('T, ^\circC'); title('line(x,y)');
subplot(2,2,4); stem(x, y, 'filled', 'LineWidth', 1.5); grid on;
xlabel('Sol'); ylabel('T, ^\circC'); title('stem(x,y)');

%% 1.2 Интерполяционный полином Ньютона
n = length(x);
F = zeros(n);
F(:,1) = y(:);
for j = 2:n
    for i = 1:(n-j+1)
        F(i,j) = (F(i+1,j-1) - F(i,j-1)) / (x(i+j-1) - x(i));
    end
end
a = F(1,:);                        % разделённые разности
fprintf('Разделённые разности (коэф. Ньютона):\n'); disp(a);

% Полином Ньютона в символьном виде (выражение для отчёта)
% (нужен Symbolic Math Toolbox; если его нет — закомментируй этот блок)
syms s
Ps = a(1); w = 1;
for k = 2:n
    w = w*(s - x(k-1));
    Ps = Ps + a(k)*w;
end
Ps = expand(Ps);
fprintf('Полином Ньютона (развёрнутый вид):\n'); disp(vpa(Ps, 6));

% Численный расчёт полинома Ньютона на плотной сетке (без local function)
Xq = linspace(min(x), max(x), 201);
Ynew = zeros(size(Xq));
for idx = 1:numel(Xq)
    P = a(1); w = 1;
    for k = 2:n
        w = w*(Xq(idx) - x(k-1));
        P = P + a(k)*w;
    end
    Ynew(idx) = P;
end

% Значение в марсианский полдень Sol = 10.5
P = a(1); w = 1;
for k = 2:n
    w = w*(xq - x(k-1));
    P = P + a(k)*w;
end
Tnew = P;
fprintf('T(10.5) по полиному Ньютона = %.4f град C\n', Tnew);

%% 1.3 interp1: все способы интерполяции
Ynear = interp1(x, y, Xq, 'nearest');
Ylin  = interp1(x, y, Xq, 'linear');
Yspl  = interp1(x, y, Xq, 'spline');
Ypc   = interp1(x, y, Xq, 'pchip');

Tnear = interp1(x, y, xq, 'nearest');
Tlin  = interp1(x, y, xq, 'linear');
Tspl  = interp1(x, y, xq, 'spline');
Tpc   = interp1(x, y, xq, 'pchip');

fprintf('T(10.5): nearest = %.4f | linear = %.4f | spline = %.4f | pchip = %.4f\n', ...
        Tnear, Tlin, Tspl, Tpc);

figure(2);
plot(x, y, 'ro', 'MarkerSize', 9, 'LineWidth', 2); hold on;
plot(Xq, Ynew,  'k-',  'LineWidth', 1.8);
plot(Xq, Ynear, 'c--', 'LineWidth', 1.2);
plot(Xq, Ylin,  'b-.', 'LineWidth', 1.2);
plot(Xq, Yspl,  'g-',  'LineWidth', 1.2);
plot(Xq, Ypc,   'm:',  'LineWidth', 1.5);
plot(xq, Tnew, 'kp', 'MarkerSize', 13, 'LineWidth', 2);
grid on; xlabel('Sol'); ylabel('T, ^\circC');
title('Вариант 5: сравнение методов интерполяции');
legend('Табличные данные', 'Ньютон', 'nearest', 'linear', 'spline', ...
       'pchip', 'T(10.5)', 'Location', 'best');

%% ================= ЗАДАЧА 2 (двумерная интерполяция) =================
% Матрица с рисунка (строки сверху вниз)
Ztop = [121  99  52  40  59  123;
        114  97  49  36  42   78;
         69  52  34  39  75   80;
         20  15  12  10  11   15;
         29  25  20  21  25   29;
        136  98  71  65  52   38];
Z = flipud(Ztop);                  % строка 1 матрицы Matlab <-> минимальный y

h  = 2.5;                          % единичный отрезок сетки, см
nx = size(Z, 2); ny = size(Z, 1);
[Xg, Yg] = meshgrid((0:nx-1)*h, (0:ny-1)*h);

figure(3);
subplot(2,3,1);
surf(Xg, Yg, Z); shading interp; colorbar;
xlabel('x, см'); ylabel('y, см'); title('Табулированная функция');

% Более мелкая сетка для интерполяции
step = h/5;
[Xi, Yi] = meshgrid(0:step:(nx-1)*h, 0:step:(ny-1)*h);
ZN = interp2(Xg, Yg, Z, Xi, Yi, 'nearest');
ZL = interp2(Xg, Yg, Z, Xi, Yi, 'linear');
ZC = interp2(Xg, Yg, Z, Xi, Yi, 'cubic');
ZS = interp2(Xg, Yg, Z, Xi, Yi, 'spline');

subplot(2,3,2); surf(Xi, Yi, ZN); shading interp; colorbar; title('nearest');
subplot(2,3,3); surf(Xi, Yi, ZL); shading interp; colorbar; title('bilinear');
subplot(2,3,4); surf(Xi, Yi, ZC); shading interp; colorbar; title('bicubic');
subplot(2,3,5); surf(Xi, Yi, ZS); shading interp; colorbar; title('spline');
subplot(2,3,6); meshc(Xi, Yi, ZS); colorbar; title('Линии уровня (meshc)');
xlabel('x, см'); ylabel('y, см');