Как я могу отображать данные в «наиболее подходящем» графике cos² в Matlab?

В настоящее время я изучаю физику и в течение нескольких недель собираю данные, связанные с «квантовой запутанностью». Теперь я дошел до того, что мне нужно построить свои данные (которые должны напоминать график cos² — и действительно) в своего рода «наиболее подходящий» график cos². Сценарий лаборатории говорит следующее:

Более точное определение видимости V (это в основном то, насколько «чисты» данные) следует из наилучшего соответствия измеренным данным с помощью функции:

f(b) = A/2[1-Vsin(b-b(центр)/P)]

Конечно, это, вероятно, мало что значит вне контекста, но, по сути, A — это амплитуда, b — угол, а P — периодичность. Следовательно, это тоже «волна», как и экспериментальные данные, которые я нашел.

Из этого я понимаю, как упоминалось ранее, что я делаю кривую «наилучшего соответствия». Однако мне сказали, что это невозможно с Excel и что лучший подход — Matlab.

Я знаю JavaScript на среднем уровне, но не знаю Matlab и надеялся на какое-то направление.

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

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


person Harry Robinson    schedule 02.11.2012    source источник
comment
Какие параметры вы хотите найти? A,b,P - или есть другие?   -  person Andrey Rubshtein    schedule 02.11.2012
comment
Почему это невозможно с Excel? Мне кажется выполнимым.   -  person    schedule 02.11.2012
comment
Я полагаю, что это то, что я также делал экспериментально (говорит вам, насколько чистый сигнал в основном, так как при минимизации вы ожидаете, что он будет равен 0). Не уверен, что мой лектор сказал: «Excel не может ничего вместить в данные».   -  person Harry Robinson    schedule 03.11.2012


Ответы (2)


Начальные шаги

Я думаю, мы должны начать с представления в Matlab функции, которую вы пытаетесь смоделировать. Прямой перевод вашей формулы выглядит так:

function y = targetfunction(A,V,P,bc,b)
    y = (A/2) * (1 - V * sin((b-bc) / P));
end

Получение данных

Следующим моим шагом будет создание данных для работы (естественно, вы будете использовать свои собственные данные). Итак, вот функция, которая генерирует зашумленные данные. Обратите внимание, что я указал некоторые значения параметров.

function [y b] = generateData(npoints,noise)

    A  = 2;
    V  = 1;
    P  = 0.7;
    bc = 0;

    b = 2 * pi * rand(npoints,1);

    y = targetfunction(A,V,P,bc,b) + noise * randn(npoints,1);

end

Функция rand генерирует случайные точки на интервале [0,1], и я умножил их на 2*pi, чтобы случайным образом получить точки на интервале [0, 2*pi]. Затем я применил целевую функцию в этих точках и добавил немного шума (функция randn генерирует нормально распределенные случайные величины).

Подходящие параметры

Самая сложная функция — это та, которая подгоняет модель к вашим данным. Для этого я использую функцию fminunc, выполняющую неограниченную минимизацию. Рутина выглядит так:

function [A V P bc] = bestfit(y,b)

    x0(1) = 1;   %# A
    x0(2) = 1;   %# V
    x0(3) = 0.5; %# P
    x0(4) = 0;   %# bc

    f = @(x) norm(y - targetfunction(x(1),x(2),x(3),x(4),b));

    x = fminunc(f,x0);

    A  = x(1);
    V  = x(2);
    P  = x(3);
    bc = x(4);

end

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

Затем я определяю функцию, которую хочу минимизировать. Он принимает один аргумент x, который распаковывается и передается в targetfunction вместе с точками b в нашем наборе данных. Надеюсь, они близки к y. Мы измеряем, насколько они далеки от y, вычитая из y и применяя функцию norm, которая возводит в квадрат каждый компонент, складывает их и извлекает квадратный корень (т. е. вычисляет среднеквадратичную ошибку).

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

Наконец, распаковываю параметры из вектора x.

Собираем все вместе

Теперь у нас есть все необходимые компоненты, поэтому нам нужна только одна последняя функция, которая свяжет их вместе. Вот:

function master

    %# Generate some data (you should read in your own data here)
    [f b] = generateData(1000,1);

    %# Find the best fitting parameters
    [A V P bc] = bestfit(f,b);

    %# Print them to the screen
    fprintf('A = %f\n',A)
    fprintf('V = %f\n',V)
    fprintf('P = %f\n',P)
    fprintf('bc = %f\n',bc)

    %# Make plots of the data and the function we have fitted
    plot(b,f,'.');
    hold on
    plot(sort(b),targetfunction(A,V,P,bc,sort(b)),'r','LineWidth',2)

end

Если я запускаю эту функцию, я вижу, что это печатается на экране:

>> master

Local minimum found.

Optimization completed because the size of the gradient is less than
the default value of the function tolerance.

A = 1.991727
V = 0.979819
P = 0.695265
bc = 0.067431

И появляется следующий сюжет:

введите здесь описание изображения

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

person Chris Taylor    schedule 02.11.2012
comment
Спасибо друг! Было удивительно с вашей стороны пройти через все это, я еще не применил это на практике, но буду завтра. Дам вам знать, как у меня дела, или если все пойдет хорошо, результаты. - person Harry Robinson; 03.11.2012
comment
Еще раз спасибо за помощь, я подгонял свои данные, и, похоже, все работает отлично. Мне приходится играть со своим значением P для каждого набора, и, похоже, я не придерживаюсь какой-либо согласованности, знаете, почему это может быть? (все мои наборы данных имеют одинаковую форму, но различаются по амплитуде и т. д.). Сейчас я попытаюсь написать функцию, чтобы найти ошибку в моем лучшем случае. - person Harry Robinson; 06.11.2012

Я немного удивлен, когда вы упомянули f (a), а ваша функция не содержит a, но в целом предположим, что вы хотите построить график f (x) = cos (x) ^ 2

Сначала определите, для каких значений x вы хотите построить график, например

xmin = 0;
stepsize = 1/100;
xmax = 6.5;
x = xmin:stepsize:xmax;
y = cos(x).^2;
plot(x,y)

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

person Dennis Jaheruddin    schedule 02.11.2012
comment
Извините, вы правы на 100%, функция тоже должна зависеть от б. Это я напортачил, так как в то время я был взволнован. Я думаю, что идея состоит в том, что я должен решить эту функцию для V и нанести каждую точку на мои экспериментальные данные (где я также пытался найти V), в некотором смысле создавая своего рода кривую наилучшего соответствия. То, что вы написали выше, все еще применимо? Большое спасибо за помощь, ребята! я попробую загрузить часть из руководства .. С уважением - person Harry Robinson; 03.11.2012