2013-05-27 4 views
7

У меня есть массив данных, который при построении выглядит так.MATLAB-кривая, экспоненциальная и линейная

http://s12.postimg.org/7ja47a6b1/temp.jpg

мне нужно использовать команду polyfit, чтобы определить наиболее подходящую экспоненту времени примерно между 1.7 и 2.3. Я также должен сравнить это экспоненциальный подходит к простому linear подходит.

Я дано уравнение Temp(t) = Temp0 * exp(-(t-t0)/tau), где t0 является время, которое соответствует температуре Temp0 (я могу выбрать, где начать свою аппроксимирующей кривую, но она должна быть ограничена в области примерно от 1,7 до 2,3). Вот моя попытка.

% Arbitrarily defined starting point 
t0 = 1.71; 

%Exponential fit 
p = polyfit(time, log(Temp), 1) 
tau = -1./p(1) 
Temp0 = exp(p(2)) 

tm = 1.8:0.01:2.3; 
Temp_t = Temp0*exp(-(tm)/tau); 
plot(time, Temp, tm, Temp_t) 

figure(2) 

%Linear fit 
p2 = polyfit(time, Temp, 1); 
Temp_p = p2(1)*tm + p2(2); 
plot(time, Temp, tm, Temp_p) 

Моей экспоненциальная форма заканчивает тем, как exponential fit. Моя линейная подгонка выглядит как linear fit. (практически идентичны). Что я делаю неправильно? Должны ли два припадка быть подобными? Мне сказали, что circshift может помочь, но я не мог понять применимость команды после прочтения файла справки.

+0

Ссылка из @Amro, похоже, была нарушена MathWorks. Обновленная версия [здесь] (http://www.mathworks.com/help/stats/examples/curve-fitting-and-distribution-fitting.html). – horchler

+1

Спасибо @horchler, вот обновленная ссылка на пример, который я ранее упомянул: [Ошибки в установке нелинейных моделей путем преобразования в линейность] (http://www.mathworks.com/help/stats/examples/pitfalls-in- фитинг-нелинейные модели-by-transforming-to-linearity.html) – Amro

ответ

4

вещи ведут себя так же, как вы ожидаете. Проблема в том, что функция, которую вы пытаетесь установить, не очень хорошая аппроксимация данных. Наблюдая кривую, кажется, что экспоненциальная часть кривой асимптотически стремится к значению около 16; но функция, которую вы используете, в конечном итоге будет иметь тенденцию к температуре 0. Таким образом, приспосабливаясь к той части, которая идет от 22 до 16, вы получите почти линейную связь. Чтобы проиллюстрировать это, я написал несколько строк кода, которые приблизительно совпадают с вашими точками данных, - и это показывает, как различные функции (которые стремятся к 0, а другие, которые стремятся к 16) дадут вам совершенно другую форму кривой. Первая (ваша исходная функция) почти линейна между значениями T 22 и 16, поэтому она будет выглядеть как линейная подгонка.

Я предлагаю вам подумать о «правильной» форме функции для соответствия - в чем заключается основная физика, которая заставляет вас выбрать конкретную форму? Правильно это необходимо ...

Вот код:

time = linspace(1.5, 2.5, 200); 
t0 = 1.7; 
t1 = 2.3; 
tau = 2.0; 

% define three sections of the function: 
s1 = find(time < t0); 
s2 = find(time >= t0 & time < t1); 
s3 = find(time > 2.3); 

% compute a shape for the function in each section: 
tData(s1) = 28 - 50*(time(s1)-1.5).^2; 
tData(s2) = 22*exp(-(time(s2)-t0)/tau); 
tData(s3) = tData(s2(end)) + (s3 - s3(1))*12/numel(s3); 

figure 
plot(time, tData) 

% modify the equation slightly: assume equilibrium temperature is 16 
% with a bit of effort one could fit for this as a second parameter 
Teq = 16; 
tData2 = tData; 
tau2 = tau/8; % decay more strongly to get down to approx the same value by t1 
tData2(s2) = (22 - Teq) * exp(- (time(s2) - t0)/tau2) + Teq; 
tData2(s3) = tData2(s2(end)) + (s3 - s3(1))*12/numel(s3); 

hold on; 
plot(time, tData2, 'r') 

Это приводит к следующему сюжету:

enter image description here

я заключаю из этого, что основной причиной ваши участки выглядят так похожи, что функция, которую вы пытаются поместиться почти линейно над выбранным вами доменом - другой вариант функции будет лучше соответствовать.

+1

Большое спасибо, Флорис. Я ценю ваш ответ. Мне сказали сравнить две формы кривой-подгонки и определить ту, которая соответствует данным «лучше». Я предположил, что формы будут более отчетливыми, а когда они не были, я стал сомневаться в моем коде. Ваш ответ очень ясный и информативный, и я благодарю вас. – scimaks

2

Если я правильно понимаю, переменные time и Temp, которые вы используете в полифите, содержат все значение (от 1,5 до 2,5). Таким образом, вы можете ограничить значение времени и Temp до 1.71 до 2.3 перед вычислением полифита (прямо сейчас он вычисляет полифит от 1,5 до 2,5, следовательно, почему линия не выровнена с точками данных).

p = polyfit(time, log(Temp), 1) 
+0

Вы правы m_power! Спасибо. Я загрузил новые варианты. Если экспоненциальная и линейная подгонка выглядят настолько похожими? Еще раз спасибо! – scimaks

4

Как я уже говорил в комментариях, есть разница между установкой линейной модели в лог-пространстве по сравнению с установкой нелинейную модель (как в смысле наименьших квадратов).

В приложении «Статистика» есть полезный demo, который объясняет ситуацию. Я адаптируя код ниже:

%# sample data 
x = [5.72 4.22 5.72 3.59 5.04 2.66 5.02 3.11 0.13 2.26 ... 
    5.39 2.57 1.20 1.82 3.23 5.46 3.15 1.84 0.21 4.29 ... 
    4.61 0.36 3.76 1.59 1.87 3.14 2.45 5.36 3.44 3.41]'; 
y = [2.66 2.91 0.94 4.28 1.76 4.08 1.11 4.33 8.94 5.25 ... 
    0.02 3.88 6.43 4.08 4.90 1.33 3.63 5.49 7.23 0.88 ... 
    3.08 8.12 1.22 4.24 6.21 5.48 4.89 2.30 4.13 2.17]'; 

xx = linspace(min(x), max(x), 100); 

%# linear regression in log-space 
%#   y = p2 * exp(p1*x) 
%# => log(y) = log(p2) + p1*x 
p_exp = polyfit(x, log(y), 1); 
yy1 = exp(p_exp(2)) .* exp(xx .* p_exp(1)); 

%# linear regression 
p_lin = polyfit(x, y, 1); 
yy2 = polyval(p_lin, xx); 

%# non-linear regression (using previous result as initial coeff) 
f = @(p,x) p(2)*exp(p(1)*x); 
p_nonlin = nlinfit(x, y, f, [p_exp(1) exp(p_exp(2))]); 
yy3 = f(p_nonlin, xx); 

plot(x,y,'o', xx,yy1,'-', xx,yy2,'-', xx,yy3,'-') 
legend({'data points','linear in log-space','linear','non-linear'}) 

regression

0

Применение

polyfit(x,y,n) 

функция в Matlab подбора кривой панели инструментов.

Смежные вопросы