Python 用Scherrer方程计算晶粒度

Python 用Scherrer方程计算晶粒度,python,numpy,physics,Python,Numpy,Physics,我试图用舍勒方程来计算晶粒尺寸,但我一直停留在半高宽上 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)) 信息:,这里是一个工作

我试图用舍勒方程来计算晶粒尺寸,但我一直停留在半高宽上

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))


信息:,

这里是一个工作示例,假设您具有正态分布。我在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')

这里是一个工作示例,假设您有一个正态分布。我在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')

很抱歉将此作为回答分享,但评论并不能让我上传图片来澄清问题。所以我用下面的图片说明了这个问题(顺便说一句,我不能编辑或删除我不情愿写的评论)。 我运行你的代码时得到了这个图


这张图说明了我在寻找什么

很抱歉将此作为一个答案与大家分享,但评论并不能让我上传图片来澄清问题。所以我用下面的图片说明了这个问题(顺便说一句,我不能编辑或删除我不情愿写的评论)。 我运行你的代码时得到了这个图


这个图表说明了我在寻找什么

我不知道如何用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)
全部清除
clc
A=dlmread(“您的数据”);%首先添加到路径
绘图(A(:,1),A(:,2))%绘制图形
等等
min_peak=input('只需写一个高于最小峰值的值:');
%该值必须介于请求峰值和非请求峰值之间(您可以在图中看到)
[yval,yval_i]=findpeaks(A(:,2),'MinPeakHeight',min_peak);%寻峰
散射(A(yval_i,1),yval);%显示峰值
β=[];
xval=[];
对于k=1:size(yval_i,1)%y(峰值)对应的x值
xval1=A(yval_i(k),1);
xval=[xval xval1];
结束
θ=xval/2;
对于i=1:尺寸(yval,1)%1,找到最大峰值的一半
yval_i1=yval_i(i,1);
而(yval(i,1))/2
我不知道如何用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)
全部清除
clc
A=dlmread(“您的数据”);%首先添加到路径
绘图(A(:,1),A(:,2))%绘制图形
等等
min_peak=input('只需写一个高于最小峰值的值:');
%该值必须介于请求峰值和非请求峰值之间(您可以在图中看到)
[yval,yval_i]=findpeaks(A(:,2),'MinPeakHeight',min_peak);%寻峰
散射(A(yval_i,1),yval);%显示峰值
β=[];
xval=[];
对于k=1:size(yval_i,1)%y(峰值)对应的x值
xval1=A(yval_i(k),1);
xval=[xval xval1];
结束
θ=xval/2;
对于i=1:尺寸(yval,1)%1,找到最大峰值的一半
yval_i1=yval_i(i,1);
而(yval(i,1))/2
请提供更多信息和正在运行的代码片段。是否要将a(高斯?)拟合到数据并提取半高宽?你到底被困在哪里?谢谢你的关注。我在试着找贝塔。[.这是Δ(2θ)。不管怎样?然后,您应该查看
scipy
模块(-->curvefit)。然后您可以定义一个拟合函数并提取半高宽和其他参数。-如果您自己尝试过并且遇到了问题(如前所述):如果您向我们提供了一个可用的代码段,我们可以使用一个运行的示例代码来解决您的问题。@nostradamus我将检查该函数。我已根据您的请求上载了示例文本文件和代码段。请提供更多信息和一个运行的代码段。是否要使用(高斯)函数到您的数据并提取半高宽?您到底被困在哪里?感谢您的关注。我正在尝试寻找β。[。β是Δ(2θ)。无论如何?然后,您应该查看
scipy
模块(->curvefit)。然后,您可以定义拟合函数并提取半高宽和其他参数。-如果您自己尝试过并且遇到问题(如前所述):如果您向我们提供了一个有效的代码段,我们可以编写一个运行中的示例代码来解决您的问题。@nostradamus我会检查该函数。我已根据您的请求上载了示例文本文件和代码段。谢谢,但对我来说它看起来有点复杂。-->我的数据看起来像这样,我的绘图代码在这里->我不在非常