Итерации косвенного уравнения с использованием MATLAB - PullRequest
1 голос
/ 02 июля 2011

Я застрял на графике графика поверхностного потенциала (shy_s) против напряжения на затворе (vgb).Я просто должен решить это уравнение ниже и найти корень для каждой итерации

vgb=vfb+shy_s+gama.*sqrt(shy_s+shy_t.*exp((shy_s-2.*shy_f)/shy_t))

, где

shy_f=0.347; %shy_f=shy_t*ln(Na/ni)

shy_t=0.0259;   %Thermal voltage = KT/e ; where k = 1.3806*10^-23 @ 300 K       

es=11.7*8.85*10^-12; 

Na=10^10; %[unit]=[m^-3)

cox=6.93*10^-12; %[unit]=[F/m^2] and t_ox=550 A

q=1.6*10^-19;

vfb=0;

gama=(sqrt(2*q*es*Na)/cox);

Здесь я должен найти значение shy_s(surface potential) для различных значений vgb(gate voltage).

Поэтому я попытался решить ее разными способами, например

a=zeros(1,100);

b=zeros(1,100);

for vgb=0:0.1:10

shy_s=0;

% Say 

p=shy_s;

% And

j=vgb-vfb-((sqrt(2*q*es*10^10))/cox).*sqrt(shy_s+shy_t.*exp((shy_s-2.*shy_f)/shy_t));

D=p-j;

if D>0

  for  shy_s=0:0.1:30;

    D=p-j;

    if D<0

        a=shy_s;

        break

    end

  end

elseif D<0

  for shy_s=0:0.1:30

    D=p-j;

    if D>0

        a=shy_s;

        break

    end

  end

end

b(1,vgb)=a;

end

plot(vgb,b)

. Таким образом, появляется следующая ошибка:

???Индексы индексов должны быть либо натуральными натуральными числами, либо логическими.

Ошибка в ==> shy_s_vs_vgb_latest2 при 78 b (1, vgb) = a;

Снова я попытался использовать скорееболее простая техника -

vgb=fzero(@(shy_s)vfb+shy_s+gama.*sqrt(shy_s+shy_t.*exp((shy_s-(2.*shy_f))/shy_t)),2)

, но она говорит -

Выход из fzero: отмена поиска интервала, содержащего изменение знака, поскольку во время поиска возникла сложная функция.(Значение функции при -0,56 равно -0,56 + 62,1585i.) Проверьте функцию или попробуйте снова с другим начальным значением.

vgb =

NaN

Другойотношение может использоваться для той же цели

(vgb-vfb-shy_s)/gama)^2 = shy_s+shy_t.*(exp((shy_s-2*shy_f)/shy_y))+shy_t.*(exp(-shy_s/shy_t)-1) 

Ответы [ 2 ]

0 голосов
/ 26 июля 2011

Здесь показано, как использовать функцию fzero для простой итерации, не делая много -

для i = 1: length (vgb)

c = @ (shy_s) ((vgb (i) -vfb-shy_s) / gama) -sqrt (abs (shy_s + shy_t. * exp ((shy_s-2. * shy_f) / shy_t)));

shy_s = fzero (c, [-3 10])

a (i) = shy_s

end

  • 'a' дает правильное повторное значение!
0 голосов
/ 02 июля 2011

Хотя вряд ли это лучшее решение, быстрый и грязный трюк заключается в следующем:

opt = optimset('TolFun',1e-8);
vgb=@(shy_s) vfb+shy_s+gama.*sqrt(shy_s+shy_t.*exp((shy_s-2.*shy_f)/shy_t));
b = fminsearch(@(shy_s) abs(vgb(shy_s)-VAL),10,opt);

с VAL - это число, для которого вы хотите найти обратное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...