Merencanakan garis tren pada skala logaritmik

Saya mencoba menambahkan garis tren ke plot semilogx tetapi tidak berhasil. Saya ingin garis tren antara y(17) dan y(20), tetapi tidak diplot sebagai garis lurus.

Ini kode saya:

%// Define equation.
x = [90868 68151 45434 34076 27261 13631 6816 3408 2273 1948 1705 1137 853 683 569 455 342 274 228 190]; 
y = [3680 3723 3800 3866 3920 4103 4250 4320 4340 4344 4350 4364 4373 4379 4384 4393 4398 4402 4405 4407];

%// Plot it
semilogx(x,y, 'bo-', 'LineWidth', 3); 
grid on; 

%// Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);

%// Give a name to the title bar. 
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')

%// Fit the y data range with a line (limitedRange).
limitedRange = 17:20;
coeffs = polyfit(x(limitedRange), y(limitedRange), 1);
xFitting = linspace(200, 90000, 50);
yFitted = polyval(coeffs, xFitting);

%// Plot the fitted line over the specified range.
hold on;
plot(xFitting, yFitted, 'ro-', 'LineWidth', 2);
legend('Original Data', 'Line Fit');

Bagaimana cara membuat garis tren tampak seperti garis?


person user1641478    schedule 06.01.2013    source sumber


Jawaban (1)


Seharusnya tidak ada keluhan untuk polyfit di sini, ini berhasil.

Ini adalah plot Anda:

masukkan deskripsi gambar di sini

Semuanya masuk akal. Alasan garis Anda terdistorsi adalah karena sumbu x Anda memiliki skala logaritmik (jika Anda menggambar garis ax+b pada skala logaritmik x, Anda akan melihatnya sebagai kurva alogx+b).

Untuk melihatnya sebagai garis pada sumbu x logaritmik, Anda perlu memasukkan distorsi "terbalik" yang sesuai. Dalam kasus Anda, garis tren harus dihitung seperti ini:

limitedRange = 17:20;
coeffs = polyfit(log10(x(limitedRange)), y(limitedRange), 1); %// Note the log10
xFitting = linspace(200, 90000, 50);
yFitted = polyval(coeffs, log10(xFitting));                   %// Note the log10

Ini belum semuanya. Dalam skala logaritmik, koordinat x yang rendah cenderung lebih berjarak, dan lingkaran garis tren akan lebih rapat pada nilai sumbu x yang lebih tinggi. Untuk meniadakannya, Anda perlu menempatkan titik-titik di xFitting secara eksponensial pada skala linier, sehingga titik-titik tersebut akan tampak berjarak linier pada skala logaritmik, misalnya:

xFitting = 10 .^ (1:.1:5);

atau gunakan fungsi bawaan logspace:

xFitting = logspace(1, 5, 50);

Kode terakhir untuk menghitung garis tren adalah:

limitedRange = 17:20;
coeffs = polyfit(log10(x(limitedRange)), y(limitedRange), 1);
xFitting = logspace(1, 5, 50);
yFitted = polyval(coeffs, log10(xFitting));

Dan ini akan memberi Anda alur cerita berikut:

masukkan deskripsi gambar di sini

Sekali lagi, perlu diingat bahwa ini adalah skala logaritmik!

Semoga ini membantu :)

person Eitan T    schedule 06.01.2013
comment
Terima kasih atas jawabannya. Yang ingin saya capai adalah menggunakan polyfit untuk mendapatkan garis lurus dalam y(17:20) sehingga saya dapat menghitung kemiringan dan perpotongan garis lurus di wilayah kurva data asli tersebut. - person user1641478; 06.01.2013
comment
@ user1641478 Y yang mana (17:20)? Poin terakhir dalam vektor data y Anda, atau poin terakhir dalam plot itu sendiri? Seperti yang telah saya jelaskan dalam jawaban saya, ini adalah poin yang berbeda karena vektor data y Anda tidak diurutkan dalam urutan menaik. - person Eitan T; 06.01.2013
comment
Terima kasih EitanT. Tolong apa yang sebenarnya ingin saya capai ditunjukkan pada gambar di tautan ini. img708.imageshack.us/img708/7717/0056005c.jpg Saya telah merencanakan data yang sama dan ingin mempunyai garis lurus seperti pada plot. Saya sangat menghargai bantuan Anda. - person user1641478; 08.01.2013
comment
@ user1641478 Ah, saya mengerti sekarang. Silakan tinjau jawaban saya yang telah direvisi. - person Eitan T; 08.01.2013