% Farkhutdinov_3_2
clc
clear all
close all
% Исходные данные
x0 = [3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10]';
y0 = [0.096 0.048 0.033 0.024 0.017 0.013 0.012 0.0075 0.056 0.007 0.006 0.004 0.004 0.0039 0.0026]';
% Построение графика исходных данных
figure(1)
plot(x0, y0, 'o', 'color', 'b')
grid on
hold on
xlabel('Ось X')
ylabel('Ось Y')
title('Приближение нелинейной зависимости')
%% 1. Предположим, что зависимость степенная: y = a * x^k
% Для линеаризации логарифмируем переменные: ln(y) = ln(a) + k*ln(x)
x1 = log(x0);
y1 = log(y0);
figure(2)
% График линеаризованных данных
plot(x1, y1, '*', 'color', 'r')
grid on
hold on
title('Линеаризованные данные степенной зависимости y=a*x^k')
% Найдем коэффициенты
X1_mat = [x1.^0, x1]; % Матрица планов (1-й столбец — единицы, 2-й — x1)
[b, bint, r, rint] = regress(y1, X1_mat); % Получаем коэффициенты
ymod1_lin = X1_mat * b; % Получаем значения модели для преобразованных данных
plot(x1, ymod1_lin, 'm')
xlabel('Ось X')
ylabel('Ось Y')
% График остатков
figure(3)
rcoplot(r, rint)
% Построение модельного графика на графике с исходными данными (Figure 1)
a = exp(b(1));
k = b(2);
ymod1 = a * (x0 .^ k);
figure(1)
plot(x0, ymod1, 'c')
%% 2. Предположим обратную зависимость: y = a + b/x
x2 = 1. ./ x0;
figure(4)
% График линеаризованных данных
plot(x2, y0, 'o')
grid on
hold on
title('Линеаризованные данные обратной зависимости y=a+b/x')
% Найдем коэффициенты
X2_mat = [x2.^0, x2];
[bn, bintn, rn, rintn] = regress(y0, X2_mat);
ymod2_lin = X2_mat * bn;
plot(x2, ymod2_lin)
% Построение графика остатков
figure(5)
rcoplot(rn, rintn)
% Построение модельного графика на графике с исходными данными (Figure 1)
ymod2 = bn(1) + bn(2) ./ x0;
figure(1)
plot(x0, ymod2, 'k')
legend('Исходные данные', 'Степенная зависимость y=a*x^b', 'Обратная зависимость y=a+b/x')
%% Расчет коэффициентов детерминации R^2 (рукописный блок снизу)
ms = mean(y0);
R1 = 1 - sum((ymod1 - y0).^2) / sum((y0 - ms).^2);
R2 = 1 - sum((ymod2 - y0).^2) / sum((y0 - ms).^2);
% Вывод значений R^2 в командное окно
fprintf('R^2 для степенной зависимости: %f\n', R1);
fprintf('R^2 для обратной зависимости: %f\n', R2);