Использование объекта Matlab Fit как функции

Подгонка Matlab, несомненно, полезна, но неясно, как использовать ее в качестве функции, кроме тривиальной интеграции и дифференциации, приведенной на официальном сайте: http://uk.mathworks.com/help/curvefit/example-differentiating-and-integration-a-fit.html

Например, при подборе, сохраненном в объекте «кривая», можно оценить кривую (x), чтобы получить число. Но как бы, например, интегрировать | curve (x) | ^ 2 (кроме неуклюжего создания новой подгонки)? Наивно пытаясь

 curve = fit(x_vals,y_vals,'smoothingspline');
 integral(curve(x)*curve(x), 0, 1)

выдает ошибку:

 Output of the function must be the same size as the input. If FUN is an array-valued integrand, set the 'ArrayValued' option to true.

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

 func=@(x)(curve(x))...; % trial solution 1
 function func_val=func(curve, x)...; % trial solution 2

person Gleb    schedule 19.03.2016    source источник


Ответы (2)


Определение функции для подынтегрального выражения с последующей интеграцией с параметром ArrayValued, установленным в значение true, работает:

 func=@(x)(curve(x)*curve(x));
 integral(func,0,1,'ArrayValued',true)
person Gleb    schedule 19.03.2016

Вам необходимо векторизовать функцию, т.е. использовать поэлементные операции, такие как curve(x).*curve(x) или curve(x).^2.

Также убедитесь, что форма вывода соответствует вводу, т.е. ввод строки дает вывод строки, аналогично столбец выводится как столбец. Кажется, что оценка подходящего объекта всегда возвращает вектор-столбец (например, f(1:10) возвращает вектор 10x1, а не 1x10).

С учетом сказанного, вот пример:

x = linspace(0,4*pi,100)';
y = sin(x);
y = y + 0.5*y.*randn(size(y));
f = fit(x, y, 'smoothingspline');

теперь вы можете интегрироваться как:

integral(@(x) reshape(f(x).^2,size(x)), 0, 1)

в этом случае его можно упростить как простую транспонирование:

integral(@(x) (f(x).^2)', 0, 1)
person Amro    schedule 19.03.2016