2016-10-11 54 views
0

我試圖用Scherrer公式計算晶粒尺寸,但我一直在半高寬。使用Scherrer公式計算晶粒尺寸

import numpy as np 
#import math 

k = 0.94 
wave_length = 1.5406e-10 

data = np.genfromtxt("G3.txt") 

indice = np.argmax(data[:,1]) 
peak = (data[indice, :]) 
#D = (k*wave_length)/(beta*cos((math.radian(theta)) 

Corresponding graphs looks likes as in the picture

信息:Scherrer equationFull width at half maximumRelated question

+0

請提供更多信息和正在運行的代碼段。你想適應(高斯?)到你的數據並提取FWHM?你究竟在哪裏卡住? – nostradamus

+0

感謝您的關注。我正在嘗試查找Beta。 [https://en.wikipedia.org/wiki/Full_width_at_half_maximum#/media/File:FWHM.svg]。這是Δ(2θ)。 – esilik

+0

不管怎麼樣?然後,你應該看看'scipy'模塊( - > curvefit)。然後,您可以定義擬合函數並提取FWHM和其他參數。 - 如果您自己嘗試過並遇到問題(如前所述):如果您向我們提供工作代碼片段,我們可以處理正在運行的示例代碼,以解決您的問題。 – nostradamus

回答

0

我不知道如何在Python解決這個問題(至少此時)。所以我用Matlab做了。

clear all 
    clc 
    A = dlmread('YOUR DATAS'); %Firstly add to path 
    plot(A(:,1),A(:,2)) %Plotting the graph 
    hold on 

    min_peak = input('Just write a value that is higher than minimum peak values: '); 
%This value must be between requested peaks and non-requested peaks (you can see this in graph) 
    [yval, yval_i] = findpeaks(A(:,2),'MinPeakHeight',min_peak); %Finding peaks 
    scatter(A(yval_i,1), yval); %Showing peaks 
    Beta = []; 
    xval = []; 
    for k = 1:size(yval_i,1) %Finding x values corresponding to y (peak) values 
     xval1 = A(yval_i(k),1); 
     xval = [xval xval1]; 
    end 
     Theta = xval/2; 

    for i = 1:size(yval,1) %Finding half of max. peak values 
     yval_i1 = yval_i(i,1); 
     while (yval(i,1))/2 < A(yval_i1+1,2) 
     yval_i1 = yval_i1+1; 
     end 

     yval_i2 = yval_i(i,1); 
     while (yval(i,1))/2 < A(yval_i2-1,2) 
     yval_i2 = yval_i2-1; 
     end 

     plot(A(yval_i2,1)*ones(size(A(:,2))), A(:,2)); 
     plot(A(yval_i1,1)*ones(size(A(:,2))), A(:,2)); 
    %  hold on 
    %  scatter(A(yval_i1,1),A(yval_i1,2)) 
    %  scatter(A(yval_i2,1),A(yval_i2,2)) 
     B = abs(A(yval_i1,1)-A(yval_i2,1)); 
     Beta = [Beta B]; 
    end 
    Beta 

    K = 0.94; 
    Lambda = 1.5406e-10; 

    To = []; 
    for j = 1:size(Beta,2) 
    To1 = (K*Lambda)/(Beta(j)*cos(Theta(j))); 
    To = [To To1]; 
    end 
    To = abs(To) 
3

這裏是工作的例子,假設你有一個正態分佈。我在一個Jupyter控制檯中運行它,所以如果你不這樣做,你必須跳過「魔術線」(%matplotlib notebook)並在最後加上plt.show()

%matplotlib notebook 
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 
import numpy as np 

numb = 500        # data size 
fwhm_in = 3        # set FWHM for the artificial data 
sigma = fwhm_in/2/np.sqrt(2*np.log(2)) # calculate sigma 
xval = np.linspace(-10, 10, numb)   # calculate x and y values using the formula from Wikipedia (see link in question) 
yval = (sigma*np.sqrt(2*np.pi))**(-1)*np.exp(-(xval)**2/(2*sigma**2))+np.random.normal(0, 0.03, numb) 

def fitFunc(x, x0, sigm):     # this defines the fit-function 
    return (sigm*np.sqrt(2*np.pi))**(-1)*np.exp(-(x-x0)**2/(2*sigm**2)) 

guess = (0.5, 2)       # tell the code with which values it should start the iteration. Close but not equal to the real values 
fitParams, fitCovariance = curve_fit(fitFunc, xval, yval, guess) # do the actual fit 
print(fitParams) 

print('FWHM_calc = {:.3f}'.format(fwhm_in)) 
fwhm_fit = 2*fitParams[1]*np.sqrt(2*np.log(2)) # calculate the FWHM from the fitted sigma (= fitParams[1], since fitParams[0] is the offset x0) 
print('FWHM_fit = {:.3f}'.format(fwhm_fit)) 

plt.plot(xval,yval, 'r.', label='data') 
plt.plot(xval, fitFunc(xval, fitParams[0], fitParams[1]), 'k-', label='fit', linewidth = 3) 

plt.grid(True) 
plt.legend() 
ax = plt.gca() 
ax.axvline(fwhm_fit/2, color='b') 
ax.axvline(-fwhm_fit/2, color='b') 

Example for the FWHM (blue vertical lines) in a normal distribution.

+0

謝謝,但它對我來說看起來有點複雜。 – esilik

+0

http://pastebin.com/YBmypc9K - >我的數據看起來像這樣,我的圖形代碼是在這裏 - > http://pastebin.com/63HRPXEm – esilik

+0

我不是很熟悉晶體學,但沒有'我的例子包含你需要的所有代碼?哪一部分讓你感到困惑?關於你的數據:我很快繪製了它,我可以看到5個高分辨率的高峯。你想提取每個峯值的FWHM嗎?或者更適合一個包絡,即一個FWHM用於五個峯值所產生的信號? – nostradamus

0

我分享這是一個答案,但意見不提供我上傳圖片,以澄清問題抱歉。所以我用下面的圖片說明了問題(順便說一下,我不能編輯或刪除我不情願地寫的評論)。 我,當我運行代碼此圖 I got this graph when I run your code

This is the graph what I'm looking for

這個圖表說明了什麼我正在尋找

+0

正確的方法是添加四個正態分佈,即你有擴展函數,並且最終將有8或12個擬合變量(x-偏移量,FWHM和四個峯值中的每一個的可能y偏移量)。這可能會使擬合程序變得混亂,所以也許最好將每個峯分別與單一的正態分佈擬合。當你這樣做時,你的問題是什麼?對於「猜測」值,您應該對每個值都進行粗略猜測,即對於左邊的第一個峯值:x0 = 40(x-offset),sigma = 0.5(並且可能需要添加y0 = -10(y偏移))。 – nostradamus

+0

@nostradamus。我感謝您的幫助。在我解釋了我的請求的每一步之後,我的朋友努力嘗試在MATLAB中完成它。他還分享了代碼。當我準備用Python來做時,我會再回來。 – esilik