Поставил себе задачу: написать программку для подбора уравнений регрессии. Она должна читать данные из файла и рассчитывать коэффициенты для различных уравнений. В качестве доки взял книгу Алексеевой-Чеснокова. Пока уравнения поддаются линеаризации, все понятно. Добрался до необходимости использования функции sqp, начались вопросы. Для четкости остановимся на уравнении y=x^c/(a+b*x^c). Преобразованием y1=x^c/y; x1=x^c уравнение становится линейным, следовательно, необходимо создать функцию от с, которая будет создавать линеаризованное уравнение, вычислять его коэффициенты и возвращать коэффициент корреляции (может, лучше что-то другое), который нужно минимизировать. Приблизительно это должно выглядеть так:
function [r,coeff]=func(c) y1=x.^c./x; x1=x.^c; coeff=polyfit(x,y,1); r=spearman(x,y); end;
Теперь эту функцию нужно вызвать из sqp: c=sqp(1,@func), где 1 - начальное приближение c. Сложность у меня возникает в том, как в эту функцию передать x и y. (Впрочем, это мои первые шаги, может, я пропускаю какое-то простое решение, просьба больно не пинать). Авторы упомянутой выше книги решают это путем использования глобальных данных, но это корявый путь, т.к. обязывает меня называть массивы точек именно x и y, в результате у меня получается неполноценная функция. Такого я не видел ни в одном языке программирования. Кроме того, для этого функция вроде должна сохраняться в отдельном файле. Если же вызов делать так: sqp(1,@func(x,y)), то у меня выдает ошибку, что не определено y, т.е. данные таким образом не передаются. Как решать задачу? Для меня не особо важно использовать именно sqp, возможно, есть другие функции минимизации, не имеющие таких проблем?
|