Нелинейная функция подгонки с использованием Matlab

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

Я попытался подогнать кривую с помощью функции типа:

ах ехр (b (x ^ k))

с k<1. Результаты аналогичны экспериментальным точкам, но все еще далеки от функции подгонки, которая мне нужна.

Я думал разделить на разные уравнения весь диапазон, но пока не нашел решения. Т.е. прямая линия для первой части и экспонента для третьей. А как насчет пика?

Любые идеи?


person TheInterestedOne    schedule 25.02.2014    source источник
comment
У вас есть Curve Fitting Toolbox? Вы также можете использовать более сложные подходы, такие как суммы синуса и косинуса.   -  person Schorsch    schedule 25.02.2014
comment
Я использую EzyFit, потому что это бесплатно   -  person TheInterestedOne    schedule 25.02.2014
comment
Извините ... данные для построения - это только первый (x) и второй (y) столбцы. Затем идет дисперсия, PRSD% и количество запусков MC, чтобы получить желаемую ошибку. Этот текстовый файл получен из сценария Fortran90.   -  person TheInterestedOne    schedule 25.02.2014


Ответы (2)


Подгонка полиномом 8-й степени:

close all; clear all;

fid = fopen('output_red.txt','r');
Z = textscan(fid, '%f %f %f %f %f');
fclose(fid);

X = log(Z{1});
Y = log(Z{2});

p = polyfit(X, Y, 8);
Y2 = polyval(p, X);

plot(exp(X), exp(Y));
hold on
plot(exp(X), exp(Y2), 'r')
legend('Original data','Fitted curve')

print('-dpng','fitted.png')

p содержит полиномиальные коэффициенты 1.2737e-05 -9.1262e-04 2.7838e-02 -4.7160e-01 4.8482e+00 -3.0958e+01 1.1990e+02 -2.5649e+02 2.3480e+02. Использование более высоких степеней полинома приведет к большей точности.

Результат

person divanov    schedule 25.02.2014
comment
Большое спасибо за помощь! Но как насчет уравнения аппроксимирующей функции? Как я могу получить коэффициент полинома? - person TheInterestedOne; 26.02.2014
comment
Вам следует запустить сценарий самостоятельно, чтобы вычислить ошибку наименьших квадратов и определить степень. - person divanov; 26.02.2014

Я думаю, ваша проблема не только в том, чтобы сгладить вашу кривую ... Если это так, нет ничего лучше, чем хорошо подобранный многочлен, указанный @divanov. Так что мне нечего сказать по этому поводу.

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

Некоторые из них уже приготовлены в инструментарии Matlab. Я предлагаю вам попробовать, например, распространение Weibull, но со временем вы можете попробовать другие виды.

person DanielTheRocketMan    schedule 26.02.2014