2014-10-28 3 views
0

У меня есть набор значений x и y, которые я хотел бы подогнать вокруг полиномиальной кривой. Функция должна иметь форму до полинома 9-го порядка;matlab optimization toolbox - polyomial fitting

y = a(1)*X.^1 + a(2)*X.^2 + a(3)*X.^3 + a(4)*X.^4 + a(5)*X.^5 + a(6)*X.^6 + a(7)*X.^7 + a(8)*X.^8 + a(9)*X.^9;

где а (п) мои коэффициенты.

Есть две проблемы, которые у меня есть. Эта кривая может не всегда иметь форму полинома 9-го порядка. Это может быть 3-й порядок, 6-й порядок или что-то еще (UP TO max 9-й порядок).

Я не уверен, как установить это с помощью инструментария оптимизации. Есть идеи?

Во-вторых, могу ли я установить ограничение, чтобы рассчитанные значения y всегда были постоянными?

Большое спасибо,

Текущий код ниже.

Функция;

function F = polyfun(a,redCO2) 
 
F = a(1)*redCO2.^1 + a(2)*redCO2.^2 + a(3)*redCO2.^3 + a(4)*redCO2.^4 + a(5)*redCO2.^5 + a(6)*redCO2.^6 + a(7)*redCO2.^7 + a(8)*redCO2.^8 + a(9)*redCO2.^9;

F = @(a) polyfun(a,X); 
 

 
a0 = [100, 100, 100, 100, 100, 100, 100, 100, 100]; % Starting guess 
 

 
a = lsqcurvefit(@polyfun,a0,X,y);

+0

Извинения, код функции должен прочитать X, где он говорит redCO2 – user3491279

+1

Если у вас есть доступ к нему, кривой фитинг инструментарий будет, вероятно, быть лучшим инструментом для использования для того, что вы пытаетесь сделать. – MrAzzaman

ответ

2

У вас есть два отдельных запроса.

Для неограниченному приступе, вам не нужно какой-либо функции вообще, проблема является линейным и mrdivide и/или pinv дает наилучшее соответствие в смысле наименьших квадратов:

a = y/bsxfun(@power, x, 1:9); 

или

a = y * pinv(bsxfun(@power, x, 1:9)); 

Если система недостоверна, одна из них даст «маленькое» решение в смысле l2-norm, другое - в смысле l0-norm. Если система полностью или полностью ограничена, они оба будут давать значение a, что минимизирует интегрально-квадратную ошибку (l2-norm).

Для ограниченного соответствия функция lsqcurvefit, которую вы уже обнаружили, работает хорошо. Просто установите lb аргумент вектор нулей, чтобы заставить a быть без neqgative:

a = lsqcurvefit(@polyval,a0,X,y,zeros(1,9)); 
+0

Ах большое спасибо - это решает мою вторую проблему. Ура! – user3491279

1

Просто используйте polyfit, что это именно то, что он предназначен для:

% Data you want to fit in x and y 
% n is the polynomial order of your choosing 
% the polynomial coefficients are returned in the vector p 
p = polyfit(x,y,n); 

Вы можете использовать polyval для вычисления полинома p над вектором значений x.

+0

Спасибо за помощь. Однако я не знаю, что такое «n», хотя в каждом случае.Поэтому я хочу использовать панель инструментов оптимизации. – user3491279

+0

Как вы ожидаете найти коэффициенты полиномов, если вы не знаете степень? Вы можете попробовать различные и использовать синтаксис '[p, S] = polyfit (x, y, n)', который также возвращает структуру 'S', которая расскажет вам больше информации о хорошей пригодности. Проверьте документ. – am304

+1

@ user3491279: Используйте 'n = 9', максимальный порядок. Если более высокий полином более низкого порядка, вы можете получить нули в ответе. –