Скачиваний:
1
Добавлен:
25.11.2025
Размер:
6 Кб
Скачать
clear all
close all
clc
warning off

prog_parameters
constants
initial_data5
parameters
grid_functions
normirovka
initial_approx

for j=1:length(U)
    if j>1
        initial_approx_U5
    end

    err=10*Delta;
    ct=0;
    while err>Delta
        ct=ct+1;
        if j==1
            Fn0=ones(I,1);
            Fp0=ones(I,1);

            A=zeros(I,I);
            B=zeros(I,1);
            A(1,1)=1;
            B(1)=fi0(1)+log(-N(1)/2+sqrt((N(1)/2)^2+1))-U(j);
            A(I,I)=1;
            B(I)=fi0(I)-log(N(I)/2+sqrt((N(I)/2)^2+1));
    
            for i=2:I-1
                A(i,i)=2/(dx(i)+dx(i-1))*(-1/dx(i)-1/dx(i-1))-Fn0(i)*exp(fi0(i))-Fp0(i)*exp(-fi0(i));
                A(i,i+1)=2/(dx(i)+dx(i-1))/dx(i);
                A(i,i-1)=2/(dx(i)+dx(i-1))/dx(i-1);
                B(i)=2/(dx(i)+dx(i-1))*((fi0(i+1)-fi0(i))/dx(i)-(fi0(i)-fi0(i-1))/dx(i-1))-Fn0(i)*exp(fi0(i))+Fp0(i)*exp(-fi0(i))+N(i);
            end
            fi=fi0-A^(-1)*B;

            clc
            ct
            voltage=U(j)*ft
            err=max(abs(fi-fi0))/max(abs(fi0))
            pause(1e-3)
            fi0=fi0+(fi-fi0)./K(j);     %чтобы добиться сходимости нужно увеличивать (коэффициент приращения переменных)
        else
            A=zeros(3*I,3*I);
            B=zeros(3*I,1);

            A(1,1)=1; 
            B(1)=fi0(1)+log(-N(1)/2+sqrt((N(1)/2)^2+1))-U(j);
            A(I,I)=1;
            B(I)=fi0(I)-log(N(I)/2+sqrt((N(I)/2)^2+1));
    
            for i=2:I-1
                A(i,i)=2/(dx(i)+dx(i-1))*(-1/dx(i)-1/dx(i-1))-Fn0(i)*exp(fi0(i))-Fp0(i)*exp(-fi0(i));
                A(i,i+1)=2/(dx(i)+dx(i-1))/dx(i);
                A(i,i-1)=2/(dx(i)+dx(i-1))/dx(i-1);
                A(i,I+i)=-exp(fi0(i));
                A(i,2*I+i)=exp(-fi0(i));
                B(i)=2/(dx(i)+dx(i-1))*((fi0(i+1)-fi0(i))/dx(i)-(fi0(i)-fi0(i-1))/dx(i-1))-Fn0(i)*exp(fi0(i))+Fp0(i)*exp(-fi0(i))+N(i);
            end
            
            A(I+1,I+1)=1;
            B(I+1)=Fn0(1)-exp(-U(j));
            A(2*I,2*I)=1;
            B(2*I)=Fn0(I)-1;
            for i=2:I-1
                A(I+i,I+i)=-mun(i)*exp(fi0(i))/dx(i)-mun(i-1)*exp(fi0(i-1))/dx(i-1);
                A(I+i,I+i+1)=mun(i)*exp(fi0(i))/dx(i);
                A(I+i,I+i-1)=mun(i-1)*exp(fi0(i-1))/dx(i-1);
                A(I+i,i)=mun(i)*exp(fi0(i))*(Fn0(i+1)-Fn0(i))/dx(i);
                A(I+i,i-1)=-mun(i-1)*exp(fi0(i-1))*(Fn0(i)-Fn0(i-1))/dx(i-1);
                B(I+i)=mun(i)*exp(fi0(i))*(Fn0(i+1)-Fn0(i))/dx(i)-mun(i-1)*exp(fi0(i-1))*(Fn0(i)-Fn0(i-1))/dx(i-1);
            end
 
            A(2*I+1,2*I+1)=1;
            B(2*I+1)=Fp0(1)-exp(U(j));
            A(3*I,3*I)=1;
            B(3*I)=Fp0(I)-1;
            for i=2:I-1
                A(2*I+i,2*I+i)=-mup(i)*exp(-fi0(i))/dx(i)-mup(i-1)*exp(-fi0(i-1))/dx(i-1);
                A(2*I+i,2*I+i+1)=mup(i)*exp(-fi0(i))/dx(i);
                A(2*I+i,2*I+i-1)=mup(i-1)*exp(-fi0(i-1))/dx(i-1);
                A(2*I+i,i)=-mup(i)*exp(-fi0(i))*(Fp0(i+1)-Fp0(i))/dx(i);
                A(2*I+i,i-1)=mup(i-1)*exp(-fi0(i-1))*(Fp0(i)-Fp0(i-1))/dx(i-1);
                B(2*I+i)=mup(i)*exp(-fi0(i))*(Fp0(i+1)-Fp0(i))/dx(i)-mup(i-1)*exp(-fi0(i-1))*(Fp0(i)-Fp0(i-1))/dx(i-1);
            end
            f=f0-A^(-1)*B;

            clc
            ct
            voltage=U(j)*ft
            err=max(abs(f-f0))/max(abs(f0))
            pause(1e-3)
            f0=f0+(f-f0)./K(j);
            fi0=f(1:I);
            Fn0=f(I+1:2*I);
            Fp0=f(2*I+1:3*I);
        end
    
        n=Fn0.*exp(fi0);
        p=Fp0.*exp(-fi0);
    
        for i=1:I-1
            E(i)=-(fi0(i+1)-fi0(i))/dx(i);
        end
        E(I)=E(I-1)+(E(I-1)-E(I-2));
    
        ro=(p-n+N).*(N0*q);
    end
    for i=2:I
        Jn(i)=mun(i-1)*exp(fi0(i-1))*(Fn0(i)-Fn0(i-1))/dx(i-1);      %можно попробовать центральную разность и посмотреть на погрешность 
        Jp(i)=-mup(i-1)*exp(-fi0(i-1))*(Fp0(i)-Fp0(i-1))/dx(i-1);
    end

    %for i=2:I-1                            чтобы показать большую погрешность когда решаем в основном базисе
        %JnDR(i)=-(mun(i)*n(i)+mun(i-1)*n(i-1))/2*(fi0(i+1)-fi0(i-1))/(dx(i)+dx(i-1));
        %JnDF(i)=(mun(i)+mun(i-1))/2*(n(i+1)-n(i-1))/(dx(i)+dx(i-1));
        %JpDR(i)=-(mup(i)*p(i)+mup(i-1)*p(i-1))/2*(fi0(i+1)-fi0(i-1))/(dx(i)+dx(i-1));
        %JpDF(i)=(mup(i)+mup(i-1))/2*(p(i+1)-p(i-1))/(dx(i)+dx(i-1));
    %end
    Jn(1)=Jn(2);
    Jn(1)=Jn(2);
    Jp(1)=Jp(2);
    Jp(1)=Jp(2);
    %JnDR(1)=JnDR(2);
    %JnDF(1)=JnDF(2);
    %JpDR(1)=JpDR(2);
    %JpDF(1)=JpDF(2);
    %JnDR(I)=JnDR(I-1);
    %JnDF(I)=JnDF(I-1);
    %JpDR(I)=JpDR(I-1);
    %JpDF(I)=JpDF(I-1);

    %Jn=JnDR+JnDF;
    %Jp=JpDR+JpDF;
    Js=Jn+Jp;
    
    if VAH==1
        Current(j)=Js(I);       % для прямой ветви ВАХ
    else
        Current(j)=Js(fix(I/2)); %для обратной ветви ВАХ
    end
    graphics
end
figure
plot(U.*ft, Current.*(J0*1e-4), 'LineWidth',LW)
xlabel('Voltage, V', 'FontSize', FS)
ylabel('Current desity, A/cm^2', 'FontSize', FS)
grid on
%для обратной ветви возьмем середину х, для прямой конец х

if VAH==1
    print(gcf,'-djpeg','IV-charact_F');
else
    print(gcf,'-djpeg','IV-charact_R');
end
Соседние файлы в папке файлы матлаб