2013-02-08 4 views
-2

intensity plotTrouver maximum local entre deux pics ou des points en utilisant Matlab

J'ai des points d'intensité qui est marqué comme rose situeraient au-dessus, et ceux-ci sont stockés dans la variable et est donnée à

intensity_info =[ 35.9349 
    46.4465 
    46.4790 
    45.7496 
    44.7496 
    43.4790 
    42.5430 
    41.4351 
    40.1829 
    37.4114 
    33.2724 
    29.5447 
    26.8373 
    24.8171 
    24.2724 
    24.2487 
    23.5228 
    23.5228 
    24.2048 
    23.7057 
    22.5228 
    22.0000 
    21.5210 
    20.7294 
    20.5430 
    20.2504 
    20.2943 
    21.0219 
    22.0000 
    23.1096 
    25.2961 
    29.3364 
    33.4351 
    37.4991 
    40.8904 
    43.2706 
    44.9798 
    47.4553 
    48.9324 
    48.6855 
    48.5210 
    47.9781 
    47.2285 
    45.5342 
    34.2310 ]; 

J'ai aussi des informations du point A, B et C qui est calculée par:

[maxtab, mintab] = peakdet(intensity_info, 1); % maxtab has A and B information and 
                % mintab has C information 

peakdet.m code mATLAB peuvent être trouvés ici: (http://www.billauer.co.il/peakdet.html). Je veux calculer le point D (où il y a une augmentation de la valeur de l'intensité de la vue, c'est-à-dire si nous descendons du point A, l'intensité diminue mais au point D, il y a une légère augmentation de l'intensité). Comme on le voit sur le graphique ci-dessous, le point C peut également se trouver à gauche du point D et dans ce cas si nous descendons du point B de la diminution d'intensité et à D il y a une légère augmentation de l'intensité. Les valeurs d'intensité pour le graphique ci-dessous sont indiquées par:

intensity_info =[29.3424 
    39.4847 
    43.7934 
    47.4333 
    49.9123 
    51.4772 
    52.1189 
    51.6601 
    48.8904 
    45.0000 
    40.9561 
    36.5868 
    32.5904 
    31.0439 
    29.9982 
    27.9579 
    26.6965 
    26.7312 
    28.5631 
    29.3912 
    29.7496 
    29.7715 
    29.7294 
    30.2706 
    30.1847 
    29.7715 
    29.2943 
    29.5667 
    31.0877 
    33.5228 
    36.7496 
    39.7496 
    42.5009 
    45.7934 
    49.1847 
    52.2048 
    53.9123 
    54.7276 
    54.9781 
    55.0000 
    54.9781 
    54.7276 
    53.9342 
    51.4246 
    38.2512]; 

et les points A, B et C calculés de la même manière que ci-dessus. Comment puis-je calculer le point D dans ces cas-là?

Intensity plot 2 with C on left of D point

+1

Ce n'est pas clair ce que vous voulez. Cherchez-vous simplement un maximum local entre A et B? –

+0

@Oli: Je pense qu'il veut la déviation maximale entre les données et une courbe (peut-être parabole ou cosinus en relief) passant par A-C-B. –

+0

@Oli: oui je veux des maxima locaux entre le point A & B – Dev

Répondre

0

J'ai trouvé la solution alternative. L'extrema.m a aidé à trouver le point D dans plus de deux garphs. Le extrema.m peut être téléchargé à partir de (http://www.mathworks.com/matlabcentral/fileexchange/12275-extrema-m-extrema2-m) et utilisé de la façon suivante pour trouver le point D:

[ymax,imax,ymin,imin] = extrema(intensity_info); 
figure;plot(x,intensity_info,x(imax),ymax,'g.',x(imin),ymin,'r.'); 
0

Je ne suis pas lire et écrire Matlab, mais si les « pattes » sont sous-tables, vous pouvez peut-être les manipuler pour créer d'autres ... quelque chose comme sous-tables (je le répète, analphabètes)

left_of_graph = part of graph from A to C 
right_of_graph = part of graph from C to B 

left_delta = some fraction of the difference between A's y-value and C's y-value 
right_delta = some fraction of the difference between C's y-value and B's y-value 

[left_maxtab,left_mintab] = peakdet(left_of_graph,left_delta) 
[right_maxtab,right_mintab] = peakdet(right_of_graph,right_delta) 

I do avoir une certaine expérience avec l'analyse de pointe, donc je vais dire que cela aidera, pas répondre, le problème. Vous pouvez trouver tous les pics que vous voulez, mais cela ne veut pas dire que les données valent la peine de plisser les yeux. Le bruit et la résolution imparfaite sont réels. Bonne chasse! PS Vous pouvez également rechercher tous les points supérieurs aux deux voisins de la bande entière. C'est garanti de ne manquer aucun des «vrais» maxima, mais de vous donner plus de «faux» maxima que vous ne pouvez en compter (bien que vos données semblent plutôt lisses!).

+0

Je n'ai pas compris votre concept de left_delta et right_delta. Pouvez-vous s'il vous plaît élaborer ce que vous voulez dire exactement ...... Merci – Dev

0

La solution que vous cherchez est une méthode numérique basée sur des itérations, dans votre cas particulier la bissection est celle qui convient le mieux à d'autres, comme la recherche séquentielle uniforme ne prend pas un intervalle comme entrée. Ce est la mise en œuvre de bissection:

function [ a, b, L ] = Bisection(f, a, b, e, d) 
%[a,b] is the interval for your local maxima; e is the error for the result and d is the step(dx). 

L = b - a; 
while(L > e) 
    xa = ((a + b)/2) - d/2; 
    xb = ((a + b)/2) + d/2; 

    ya = subs(f,xa); 
    yb = subs(f,xb); 

    if(ya < yb) 
     a = xa; 
    else 
     b = xb; 
    end 
    L = b - a;  
end 
end 

La méthode avant est assez efficace et simple à utiliser, bien qu'il y en a d'autres encore meilleurs (en performance) comme les méthodes de la section de Fibonacci et or.

Cheers.

+0

@ Daniel: Merci pour votre réponse. Pouvez-vous pls. dites-moi ce que si 'f'? – Dev

+0

f est l'expression symbolique de votre fonction – Daniel

+0

Si vous n'avez pas la fonction, vous voudrez peut-être aller l'aproximativement avec interpolation lagrange ou newton. – Daniel

Questions connexes