How do I extract values from fitting my custom equation to a data set with multiple data entries?

9 次查看(过去 30 天)
This is for a lab I have to do for class and am sort of stuck at this point. I have a graph with multiple plots. This is at %Plotting Long Channel. I want to fit the equation below to each one of those data sets to extrapolate the mobility term (u) and Threshold Voltage (Vt) for each Vg value. Vt and u are the fitting parameters. At each Vg value I have data sets of Id vs Vd as you can see in my excel spreedsheet. My values for Vg are 0:0.2:1.2. I have the custom fitting toolbox but I am getting no where with it, errors left and right. I want to fit the equation to each of my data sets and find the mobility term that will fit it to the data. Please ignore the Vt already there. I'm trying to get the Vt two seperate ways then compare.
bd.jpg
% PLOTTING Id vs Vd
clear all;
clc;
%Long Channel
Vd = xlsread('W1umL3um.xlsx', 'C4:C53');
Id0 = xlsread('W1umL3um.xlsx', 'D56:D5105');
Id2 = xlsread('W1umL3um.xlsx', 'F56:F105');
Id4 = xlsread('W1umL3um.xlsx', 'H56:H105');
Id6 = xlsread('W1umL3um.xlsx', 'J56:J105');
Id8 = xlsread('W1umL3um.xlsx', 'L56:L105');
Id10 = xlsread('W1umL3um.xlsx', 'N56:N105');
Id12 = xlsread('W1umL3um.xlsx', 'P56:P105');
%Short Channel
SVd = xlsread('W1umL60nm.xlsx', 'C4:C53');
SId0 = xlsread('W1umL60nm.xlsx', 'D56:D105');
SId2 = xlsread('W1umL60nm.xlsx', 'F56:F105');
SId4 = xlsread('W1umL60nm.xlsx', 'H56:H105');
SId6 = xlsread('W1umL60nm.xlsx', 'J56:J105');
SId8 = xlsread('W1umL60nm.xlsx', 'L56:L105');
SId10 = xlsread('W1umL60nm.xlsx', 'N56:N105');
SId12 = xlsread('W1umL60nm.xlsx', 'P56:P5105');
%Plotting Long Channel
figure('Name', 'Long Channel IdVd curve');
Lp = plot(Vd, Id0, Vd, Id2, Vd, Id4, Vd, Id6, Vd, Id8, Vd, Id10, Vd, Id12);
title('Drain Voltage vs Drain Current at varying Gate Voltages');
xlabel('Drain Voltage (V)');
ylabel('Drain Current (mA/um)');
legend({'Vg = 0V','Vg = 0.2V','Vg = 0.4V','Vg = 0.6V','Vg = 0.8V','Vg = 1.0V','Vg = 1.2V'},'Location','east')
grid on
%Plotting Short Channel
figure('Name', 'Short Channel IdVd curve');
Sp = plot(SVd, SId0, SVd, SId2, SVd, SId4, SVd, SId6, SVd, SId8, SVd, SId10, SVd, SId12);
title('Drain Voltage vs Drain Current at varying Gate Voltages');
xlabel('Drain Voltage (V)');
ylabel('Drain Current (mA/um)');
legend({'Vg = 0V','Vg = 0.2V','Vg = 0.4V','Vg = 0.6V','Vg = 0.8V','Vg = 1.0V','Vg = 1.2V'},'Location','east');
grid on
%Plotting Id vs Vg for Long Channel @ Vd = 0.2040816
Vg = xlsread('W1umL3um.xlsx','For Vt','D5:D11');
VtId = xlsread('W1umL3um.xlsx','For Vt','E5:E11');
dydx = gradient(VtId,mean(diff(Vg))); % Calculate Numerical Derivative At Every Point
[maxslope,idx] = max(dydx); % Find Maximum Slope & Index
x = Vg(idx);
y = VtId(idx);
intcpt = (y - maxslope*x); % Calculate Tangent Line Intercept
tangentline = maxslope*Vg+intcpt; % Calculate Tangent Line
Vt = ((-2E-6)-intcpt)/maxslope % Minumum X-Axis Intercept
figure('Name','Graph to get Vt');
IdVg = plot(Vg, VtId);
hold on
plot(Vg, tangentline, '--');
hold off
xlabel('Gate Voltage (V)');
ylabel('Drain Current (mA/um)');
legend({'Vd = 0.2040816V', 'Tangent'},'Location','northwest')
ylim([0 max(ylim)])
%Vg for the purpose of finding u
%Mobility equation from long channel equation
  10 个评论
Star Strider
Star Strider 2018-12-1
I am still not getting anything for ‘Id0’. It is an empty matrix. (I am using the file I downloaded previously, since it has the same name.)
I cannot make any sense out of ‘SVd’ and ‘SId0’. They look completely random.

请先登录,再进行评论。

采纳的回答

Ausamah Hobbi
Ausamah Hobbi 2018-12-3
编辑:Ausamah Hobbi 2018-12-3
To Everyone who might be interested in the answer. Here is the code I'm using. I've commented some things out so I could plot them all together. I used a curve fitting app but generated the code for it.
clc;
%Long Channel
Vd = xlsread('W1umL3um.xlsx', 'C4:C43');
Id0 = xlsread('W1umL3um.xlsx', 'D56:D95');
Id2 = xlsread('W1umL3um.xlsx', 'F56:F95');
Id4 = xlsread('W1umL3um.xlsx', 'H56:H95');
Id6 = xlsread('W1umL3um.xlsx', 'J56:J95');
Id8 = xlsread('W1umL3um.xlsx', 'L56:L95');
Id10 = xlsread('W1umL3um.xlsx', 'N56:N95');
Id12 = xlsread('W1umL3um.xlsx', 'P56:P95');
% Fit: 'Vg = 0V'.
[xData, yData] = prepareCurveData( Vd, Id0 );
% Set up fittype and options.
ft = fittype( '(a1.*0.00575.*((0-b1).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off'
opts.StartPoint = [0.196595250431208 0.251083857976031];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
figure( 'Name', 'Vg = 0V' );
h1 = plot( fitresult, xData, yData, 'ok')
h1(1).LineWidth = 1;
h1(2).LineWidth = 2;
%legend( h1, 'Id0 vs. Vd', 'Vg = 0V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id0
%grid on
hold on
%Fit: 'Vg = 0.2V'.
[xData, yData] = prepareCurveData( Vd, Id2 );
% Set up fittype and options.
ft = fittype( '(a2.*0.00575.*((0.2-b2).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.162182308193243 0.794284540683907];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
%figure( 'Name', 'Vg = 10.2V' );
h2 = plot( fitresult, xData, yData, 'ok')
h2(1).LineWidth = 1;
h2(2).LineWidth = 2;
%legend( h2, 'Id2 vs. Vd', 'Vg = 10.2V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id2
grid on
% Fit: 'Vg = 0.4V'.
[xData, yData] = prepareCurveData( Vd, Id4 );
% Set up fittype and options.
ft = fittype( '(a3.*0.00575.*((0.4-b3).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.311215042044805 0.528533135506213];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
%figure( 'Name', 'Vg = 0.4V' );
h3 = plot( fitresult, xData, yData, 'ok')
h3(1).LineWidth = 1;
h3(2).LineWidth = 2;
%legend( h3, 'Id4 vs. Vd', 'Vg = 0.4V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id4
%grid on
% Fit: 'Vg = 0.6V'.
[xData, yData] = prepareCurveData( Vd, Id6 );
% Set up fittype and options.
ft = fittype( '(a4.*0.00575.*((0.6-b4).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.165648729499781 0.601981941401637];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
%figure( 'Name', 'Vg = 0.6V' );
h4 = plot( fitresult, xData, yData, 'ok')
h4(1).LineWidth = 1;
h4(2).LineWidth = 2;
%legend( h4, 'Id6 vs. Vd', 'Vg = 0.6V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id6
%grid on
% Fit: 'Vg = 0.8V'.
[xData, yData] = prepareCurveData( Vd, Id8 );
% Set up fittype and options.
ft = fittype( '(a5.*0.00575.*((0.8-b5).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.262971284540144 0.654079098476782];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
%figure( 'Name', 'Vg = 0.8V' );
h5 = plot( fitresult, xData, yData, 'ok')
h5(1).LineWidth = 1;
h5(2).LineWidth = 2;
%legend( h5, 'Id8 vs. Vd', 'Vg = 0.8V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id8
%grid on
% Fit: 'Vg = 1.0V'.
[xData, yData] = prepareCurveData( Vd, Id10 );
% Set up fittype and options.
ft = fittype( '(a6.*0.00575.*((1.0-b6).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.689214503140008 0.748151592823709];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
%figure( 'Name', 'Vg = 1.0V' );
h6 = plot( fitresult, xData, yData, 'ok')
h6(1).LineWidth = 1;
h6(2).LineWidth = 3;
%legend( h6, 'Id10 vs. Vd', 'Vg = 1.0V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id10
%grid on
% Fit: 'Vg = 1.2V'.
[xData, yData] = prepareCurveData( Vd, Id12 );
% Set up fittype and options.
ft = fittype( '(a7.*0.00575.*((1.2-b7).*Vd - (Vd.^2/2)))*1000', 'independent', 'Vd', 'dependent', 'Id12' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.380445846975357 0.567821640725221];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
%figure( 'Name', 'Vg = 1.2V' );
h7 = plot( fitresult, xData, yData, 'ok')
h7(1).LineWidth = 1;
h7(2).LineWidth = 2;
%legend( h7, 'Id vs. Vd', 'Vg = 1.2V', 'Location', 'NorthEast' );
% Label axes
%xlabel Vd
%ylabel Id12
%grid on
grid on
xlabel ('Drain Voltage (V)')
ylabel ('Drain Current (mA/um)')
title ('Drain Current vs Drain Voltage w/ varying Gate Voltage')
hold off

更多回答(1 个)

Star Strider
Star Strider 2018-12-1
I am using this code to estimate your parameters:
Vd = xlsread('W1umL3um.xlsx', 'C4:C53');
Id0 = xlsread('W1umL3um.xlsx', 'D56:D5105');
SVd = xlsread('W1umL60nm.xlsx', 'C4:C53');
SId0 = xlsread('W1umL60nm.xlsx', 'D56:D105');
Vg = 0:0.2:1.2;
% % % b(1) = mu, b(2) = Vt
% Idfcn = @(b,Vd) b(1).*Z*Ci.*(Vg-b(2)).*Vd - Vd.^2/2)./L;
ZCiL = 0.00575;
Idfcn = @(b,Vd) b(1).*ZCiL.*(Vg(1)-b(2)).*Vd - Vd.^2/2;
% [B,fv] = fminsearch(@(b) norm(Id0 - Idfcn(b,Vd)), [1;1]);
[B,fv] = fminsearch(@(b) norm(SId0 - Idfcn(b,SVd)), 1000*rand(2,1));
figure
plot(SVd, SId0, 'p')
hold on
plot(SVd, Idfcn(B,SVd), '-g')
hold off
grid
However, since I cannot use your data (it is either nonexistend or apparently random), I can go not further.
  11 个评论
Ausamah Hobbi
Ausamah Hobbi 2018-12-3
编辑:Ausamah Hobbi 2018-12-3
I do have the Symbolic math toolbox. How would it change it?
I have updated the code to what you mentioned.
clc;
% INITIALIZE MATLAB
close all;
clc;
clear all;
syms Vt
syms x
syms Vd
syms Vg
syms Cop %Constant of p
syms r
%Short Channel
SVd = xlsread('W1umL60nm.xlsx', 'C4:C53');
SId0 = xlsread('W1umL60nm.xlsx', 'D56:D105');
SId2 = xlsread('W1umL60nm.xlsx', 'F56:F105');
SId4 = xlsread('W1umL60nm.xlsx', 'H56:H105');
SId6 = xlsread('W1umL60nm.xlsx', 'J56:J105');
SId8 = xlsread('W1umL60nm.xlsx', 'L56:L105');
SId10 = xlsread('W1umL60nm.xlsx', 'N56:N105');
SId12 = xlsread('W1umL60nm.xlsx', 'P56:P105');
%Vg = 0:0.2:1.2;
vd = @(SVd, r) (1/0.026).*r.*SVd; %r is the fitting parameter
% Ro (Density)
Cop = 1.652e+16; %Coefficient of Ro
p = @(Vg, Vt) Cop*(Vg-Vt); %Vt is the fitting parameter
% Breaking down the Integral
a = @(SVd,r) 1+exp(vd(SVd, r));
b = @(SVd,Vg,Vt,r)sqrt(a(SVd,r)^2+4*exp(vd(SVd,r))*(exp(p(Vg, Vt))-1));
u = @(SVd,Vg,Vt,r) log(b(SVd,Vg,Vt)-(1+exp(vd(SVd,r)))-log(2));
f = @(SVd,Vg,Vt,r,x)sqrt(u(SVd,Vg,Vt,r))./(1+exp(u(SVd,Vg,Vt,r)-x));
%F = @(x)integral(@(u)f(u,x),0,inf, 'ArrayValued', true);
int(f, SVd, Vg, r, [0 inf])
Ausamah Hobbi
Ausamah Hobbi 2018-12-4
Hey Star, here's an updated version of my code. Of course there are errors.
% INITIALIZE MATLAB
close all;
clc;
clear all;
syms Vt
syms x
syms Vd
syms Vg
syms Cop %Constant of p
syms r
Z = 1e-6;
q = 1.6e-19;
kT = 4.11e-21;
m0 = 9.1e-31;
hbar = 1.054e-34;
mt = .2 * m0;
mv = 2.5;
e0 = 8.85e-12;
er = 3.7;
Ci = .0163725;
%Defining Vg
Vg0 = 0;
Vg2 = 0.2;
Vg4 = 0.4;
Vg6 = 0.6;
Vg8 = 0.8;
Vg10 = 1.0;
Vg12 = 1.2;
%Short Channel
SVd = xlsread('W1umL60nm.xlsx', 'C4:C53');
SId0 = xlsread('W1umL60nm.xlsx', 'D56:D105');
SId2 = xlsread('W1umL60nm.xlsx', 'F56:F105');
SId4 = xlsread('W1umL60nm.xlsx', 'H56:H105');
SId6 = xlsread('W1umL60nm.xlsx', 'J56:J105');
SId8 = xlsread('W1umL60nm.xlsx', 'L56:L105');
SId10 = xlsread('W1umL60nm.xlsx', 'N56:N105');
SId12 = xlsread('W1umL60nm.xlsx', 'P56:P105');
Io = (sqrt(2).*q.*((kT)^1.5).*mv.*sqrt(mt))/((pi.^2).*(hbar).^2);
vd = @(Vd) (q.*r.*SVd)/(kT);
Ro = @(Vg) (2.*pi.*(hbar.^2).*Ci.*(Vg-Vt))./(q.*kT.*mt.*mv);
fermi_half = @(x) (x.^0.5)/(1+exp.^(x-a));
fermi_half_vd = @(x) (x.^0.5)/(1+exp.^(x-a+vd(Vd)));
%To get u(Vd, Vg)
a = @(Vd, Vg) sqrt((1 + exp.^(vd(Vd))).^2 + 4.*exp(vd(Vd)).*(math.exp(p(Vg)) - 1));
b = @(Vd)(1 + exp.^(vd(Vd)));
c = log(2);
u = @(Vd, Vg) log(a-b)-c
fermi_half_int = quadgk(fermi_half(x), 0, inf)
fermi_half_vd_int = quadgk(fermi_half_vd(x), 0, inf)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Linear and Nonlinear Regression 的更多信息

产品


版本

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by