%% پاک کردن محیط
clear all;
close all;
clc;
%% ============ دادهها ============
T = [150, 160, 170, 180, 190]';
Yield = [65, 72, 78, 82, 80]';
fprintf('================== مقایسه روشهای رگرسیون ==================\n\n');
%% ============ ۱. رگرسیون خطی ============
X_linear = [ones(length(T), 1), T];
coeff_linear = X_linear \ Yield;
a_linear = coeff_linear(2);
b_linear = coeff_linear(1);
pred_linear = X_linear * coeff_linear;
r2_linear = 1 - sum((Yield - pred_linear).^2) / sum((Yield - mean(Yield)).^2);
rmse_linear = sqrt(mean((Yield - pred_linear).^2));
fprintf('۱. رگرسیون خطی:\n');
fprintf(' معادله: Yield = %.4f * T + %.4f\n', a_linear, b_linear);
fprintf(' R² = %.4f\n', r2_linear);
fprintf(' RMSE = %.4f\n\n', rmse_linear);
%% ============ ۲. رگرسیون چندجملهای درجه ۲ ============
X_poly2 = [T.^2, T, ones(length(T), 1)];
coeff_poly2 = X_poly2 \ Yield;
a_poly2 = coeff_poly2(1);
b_poly2 = coeff_poly2(2);
c_poly2 = coeff_poly2(3);
pred_poly2 = X_poly2 * coeff_poly2;
r2_poly2 = 1 - sum((Yield - pred_poly2).^2) / sum((Yield - mean(Yield)).^2);
rmse_poly2 = sqrt(mean((Yield - pred_poly2).^2));
fprintf('۲. رگرسیون چندجملهای درجه ۲:\n');
fprintf(' معادله: Yield = %.6f*T² + %.6f*T + %.4f\n', a_poly2, b_poly2, c_poly2);
fprintf(' R² = %.4f\n', r2_poly2);
fprintf(' RMSE = %.4f\n\n', rmse_poly2);
%% ============ ۳. رگرسیون چندجملهای درجه ۳ ============
X_poly3 = [T.^3, T.^2, T, ones(length(T), 1)];
coeff_poly3 = X_poly3 \ Yield;
a_poly3 = coeff_poly3(1);
b_poly3 = coeff_poly3(2);
c_poly3 = coeff_poly3(3);
d_poly3 = coeff_poly3(4);
pred_poly3 = X_poly3 * coeff_poly3;
r2_poly3 = 1 - sum((Yield - pred_poly3).^2) / sum((Yield - mean(Yield)).^2);
rmse_poly3 = sqrt(mean((Yield - pred_poly3).^2));
fprintf('۳. رگرسیون چندجملهای درجه ۳:\n');
fprintf(' معادله: Yield = %.6f*T³ + %.6f*T² + %.6f*T + %.4f\n', a_poly3, b_poly3, c_poly3, d_poly3);
fprintf(' R² = %.4f\n', r2_poly3);
fprintf(' RMSE = %.4f\n\n', rmse_poly3);
%% ============ ۴. رگرسیون توانی (Power) ============
logT = log(T);
logYield = log(Yield);
X_power = [ones(length(T), 1), logT];
coeff_power = X_power \ logYield;
b_power = coeff_power(2);
a_power = exp(coeff_power(1));
pred_power = a_power * T.^b_power;
r2_power = 1 - sum((Yield - pred_power).^2) / sum((Yield - mean(Yield)).^2);
rmse_power = sqrt(mean((Yield - pred_power).^2));
fprintf('۴. رگرسیون توانی (Power):\n');
fprintf(' معادله: Yield = %.4f * T^%.4f\n', a_power, b_power);
fprintf(' R² = %.4f\n', r2_power);
fprintf(' RMSE = %.4f\n\n', rmse_power);
%% ============ ۵. رگرسیون نمایی (Exponential) ============
X_exp = [ones(length(T), 1), T];
logYield = log(Yield);
coeff_exp = X_exp \ logYield;
b_exp = coeff_exp(2);
a_exp = exp(coeff_exp(1));
pred_exp = a_exp * exp(b_exp * T);
r2_exp = 1 - sum((Yield - pred_exp).^2) / sum((Yield - mean(Yield)).^2);
rmse_exp = sqrt(mean((Yield - pred_exp).^2));
fprintf('۵. رگرسیون نمایی (Exponential):\n');
fprintf(' معادله: Yield = %.4f * exp(%.4f*T)\n', a_exp, b_exp);
fprintf(' R² = %.4f\n', r2_exp);
fprintf(' RMSE = %.4f\n\n', rmse_exp);
%% ============ ۶. رگرسیون لگاریتمی (Logarithmic) ============
X_log = [ones(length(T), 1), log(T)];
coeff_log = X_log \ Yield;
a_log = coeff_log(1);
b_log = coeff_log(2);
pred_log = a_log + b_log * log(T);
r2_log = 1 - sum((Yield - pred_log).^2) / sum((Yield - mean(Yield)).^2);
rmse_log = sqrt(mean((Yield - pred_log).^2));
fprintf('۶. رگرسیون لگاریتمی (Logarithmic):\n');
fprintf(' معادله: Yield = %.4f + %.4f*ln(T)\n', a_log, b_log);
fprintf(' R² = %.4f\n', r2_log);
fprintf(' RMSE = %.4f\n\n', rmse_log);
%% ============ ۷. رگرسیون معکوس (Inverse) ============
X_inv = [ones(length(T), 1), 1./T];
coeff_inv = X_inv \ Yield;
a_inv = coeff_inv(1);
b_inv = coeff_inv(2);
pred_inv = a_inv + b_inv ./ T;
r2_inv = 1 - sum((Yield - pred_inv).^2) / sum((Yield - mean(Yield)).^2);
rmse_inv = sqrt(mean((Yield - pred_inv).^2));
fprintf('۷. رگرسیون معکوس (Inverse):\n');
fprintf(' معادله: Yield = %.4f + %.4f/T\n', a_inv, b_inv);
fprintf(' R² = %.4f\n', r2_inv);
fprintf(' RMSE = %.4f\n\n', rmse_inv);
%% ============ ۸. رگرسیون درجه ۲ با مرکزیت (برای پایداری عددی) ============
T_centered = T - mean(T);
X_poly2_centered = [T_centered.^2, T_centered, ones(length(T), 1)];
coeff_poly2_centered = X_poly2_centered \ Yield;
pred_poly2_centered = X_poly2_centered * coeff_poly2_centered;
r2_poly2_centered = 1 - sum((Yield - pred_poly2_centered).^2) / sum((Yield - mean(Yield)).^2);
rmse_poly2_centered = sqrt(mean((Yield - pred_poly2_centered).^2));
fprintf('۸. رگرسیون چندجملهای درجه ۲ (مرکزی):\n');
fprintf(' معادله: Yield = %.6f*(T-%.2f)² + %.6f*(T-%.2f) + %.4f\n', ...
coeff_poly2_centered(1), mean(T), coeff_poly2_centered(2), mean(T), coeff_poly2_centered(3));
fprintf(' R² = %.4f\n', r2_poly2_centered);
fprintf(' RMSE = %.4f\n\n', rmse_poly2_centered);
%% ============ پیشبینی برای دمای ۱۹۰ ============
T_new = 190;
pred_linear_190 = a_linear * T_new + b_linear;
pred_poly2_190 = a_poly2 * T_new^2 + b_poly2 * T_new + c_poly2;
pred_poly3_190 = a_poly3 * T_new^3 + b_poly3 * T_new^2 + c_poly3 * T_new + d_poly3;
pred_power_190 = a_power * T_new^b_power;
pred_exp_190 = a_exp * exp(b_exp * T_new);
pred_log_190 = a_log + b_log * log(T_new);
pred_inv_190 = a_inv + b_inv / T_new;
pred_poly2_centered_190 = coeff_poly2_centered(1)*(T_new-mean(T))^2 + ...
coeff_poly2_centered(2)*(T_new-mean(T)) + ...
coeff_poly2_centered(3);
fprintf('================== پیشبینی برای دمای ۱۹۰ ==================\n');
fprintf(' ۱. خطی: %.2f\n', pred_linear_190);
fprintf(' ۲. چندجملهای درجه ۲: %.2f\n', pred_poly2_190);
fprintf(' ۳. چندجملهای درجه ۳: %.2f\n', pred_poly3_190);
fprintf(' ۴. توانی: %.2f\n', pred_power_190);
fprintf(' ۵. نمایی: %.2f\n', pred_exp_190);
fprintf(' ۶. لگاریتمی: %.2f\n', pred_log_190);
fprintf(' ۷. معکوس: %.2f\n', pred_inv_190);
fprintf(' ۸. چندجملهای درجه ۲ (مرکزی): %.2f\n', pred_poly2_centered_190);
fprintf(' مقدار واقعی: 80\n\n');
%% ============ رسم نمودار ============
figure('Position', [100, 100, 1200, 700]);
% نقاط دادههای واقعی
plot(T, Yield, 'ro', 'MarkerSize', 15, 'LineWidth', 2, 'DisplayName', 'دادههای واقعی');
hold on;
% منحنیهای رگرسیون
T_range = linspace(145, 195, 100)';
% ۱. خطی
Y_linear_range = a_linear * T_range + b_linear;
plot(T_range, Y_linear_range, 'b-', 'LineWidth', 2, 'DisplayName', 'خطی');
% ۲. چندجملهای درجه ۲
Y_poly2_range = a_poly2 * T_range.^2 + b_poly2 * T_range + c_poly2;
plot(T_range, Y_poly2_range, 'g-', 'LineWidth', 2, 'DisplayName', 'چندجملهای درجه ۲');
% ۳. چندجملهای درجه ۳
Y_poly3_range = a_poly3 * T_range.^3 + b_poly3 * T_range.^2 + c_poly3 * T_range + d_poly3;
plot(T_range, Y_poly3_range, 'c-', 'LineWidth', 2, 'DisplayName', 'چندجملهای درجه ۳');
% ۴. توانی
Y_power_range = a_power * T_range.^b_power;
plot(T_range, Y_power_range, 'm-', 'LineWidth', 2, 'DisplayName', 'توانی');
% ۵. نمایی
Y_exp_range = a_exp * exp(b_exp * T_range);
plot(T_range, Y_exp_range, 'y-', 'LineWidth', 2, 'DisplayName', 'نمایی');
% ۶. لگاریتمی
Y_log_range = a_log + b_log * log(T_range);
plot(T_range, Y_log_range, 'k-', 'LineWidth', 2, 'DisplayName', 'لگاریتمی');
% ۷. معکوس
Y_inv_range = a_inv + b_inv ./ T_range;
plot(T_range, Y_inv_range, 'r-', 'LineWidth', 2, 'DisplayName', 'معکوس');
% ۸. چندجملهای درجه ۲ مرکزی
T_centered_range = T_range - mean(T);
Y_poly2_centered_range = coeff_poly2_centered(1)*T_centered_range.^2 + ...
coeff_poly2_centered(2)*T_centered_range + ...
coeff_poly2_centered(3);
plot(T_range, Y_poly2_centered_range, '--', 'Color', [0.8, 0.4, 0], 'LineWidth', 2, ...
'DisplayName', 'چندجملهای درجه ۲ (مرکزی)');
hold off;
xlabel('دما (°C)', 'FontSize', 14);
ylabel('بازده (%)', 'FontSize', 14);
title('مقایسه ۸ روش رگرسیون (بدون Toolbox اضافی)', 'FontSize', 16);
legend('Location', 'best', 'FontSize', 9);
grid on;
grid minor;
%% ============ جدول نتایج ============
fprintf('================== خلاصه نتایج ==================\n\n');
fprintf('%-30s | %10s | %10s\n', 'روش', 'R²', 'RMSE');
fprintf('--------------------------------------------------------------\n');
fprintf('%-30s | %10.4f | %10.4f\n', 'خطی', r2_linear, rmse_linear);
fprintf('%-30s | %10.4f | %10.4f\n', 'چندجملهای درجه ۲', r2_poly2, rmse_poly2);
fprintf('%-30s | %10.4f | %10.4f\n', 'چندجملهای درجه ۳', r2_poly3, rmse_poly3);
fprintf('%-30s | %10.4f | %10.4f\n', 'توانی', r2_power, rmse_power);
fprintf('%-30s | %10.4f | %10.4f\n', 'نمایی', r2_exp, rmse_exp);
fprintf('%-30s | %10.4f | %10.4f\n', 'لگاریتمی', r2_log, rmse_log);
fprintf('%-30s | %10.4f | %10.4f\n', 'معکوس', r2_inv, rmse_inv);
fprintf('%-30s | %10.4f | %10.4f\n', 'چندجملهای درجه ۲ (مرکزی)', r2_poly2_centered, rmse_poly2_centered);
fprintf('\n✅ برنامه با موفقیت اجرا شد! (بدون نیاز به Toolbox اضافی)\n');
%% ============ بهترین روش ============
fprintf('\n================== بهترین روش ==================\n');
[~, idx] = max([r2_linear, r2_poly2, r2_poly3, r2_power, r2_exp, r2_log, r2_inv, r2_poly2_centered]);
methods = {'خطی', 'چندجملهای درجه ۲', 'چندجملهای درجه ۳', 'توانی', 'نمایی', 'لگاریتمی', 'معکوس', 'چندجملهای درجه ۲ (مرکزی)'};
r2_values = [r2_linear, r2_poly2, r2_poly3, r2_power, r2_exp, r2_log, r2_inv, r2_poly2_centered];
fprintf('🥇 بهترین روش از نظر R²: %s با R² = %.4f\n', methods{idx}, r2_values(idx));
fprintf('\nنتیجه نهایی: با توجه به سادگی و دقت، ');
fprintf('"چندجملهای درجه ۲" بهترین انتخاب برای این دادههاست.\n');
To embed this project on your website, copy the following code and paste it into your website's HTML: