- •Аннотация
- •Содержание
- •Введение
- •Техническое задание
- •Формальная постановка задачи
- •Математическая модель схемы
- •Выбор алгоритмов решения математической модели
- •Метод Ньютона.
- •Метод Эйлера
- •Технологическая часть
- •Реализация мм в приложении
- •Программная реализация
- •Выбор средств разработки
- •Исходный файл программы
- •Анализ полученной модели.
- •Заключение и выводы
- •Список литературы
- •Приложение 1: Листинг программы
- •Приложение 2: Результаты работы программы
Список литературы
1. Трудоношин В.А. , Пивоварова Н.В. , «САПР» (том 4), под редакцией И.П. Норенкова, Москва, «Высшая школа», 1986 год, 160 с.
2. Трудоношин В.А , лекции по курсу «Модели и методы принятия проектных решений», 2010 год.
3. Трудоношин В.А , лекции по курсу «Модели и методы принятия проектных решений», 2011 год.
4. Ультрих Титце, Кристоф Шенк, «Полупроводниковая схемотехника. Том 1», Москва, 2008 год, 832 стр.
Приложение 1: Листинг программы
Файл main.m:
%Моделирование электрической схемы с использованием табличного метода
global R1 R2 C1 C2 C3 L It mFit Amp Tau
%параметры схемы
C1 = 1e-9; C2 = 1e-9;
L = 0.001;
%параметры диода
R1 = 20;
R2 = 10^6;
It = 1e-12;
C3 = 2e-12;
mFit = 0.026;
Amp = 10;
Tau = 1e-3;
n = 0;
Nmax = 10;
dt = 1e-15;
T = 1e-3;
dt_min = 1e-15;
dt_max = 1e-5;
dt_start = 1e-15;
tcur = 0;
DeltaAccuracy = 1e-2;
%начальные приближения
UIn = zeros(16, 1);
UIn1 = zeros(16, 1);
UIn11 = zeros(16, 1);
FiValues = zeros(1, 16);
tValues = [0];
dtprev = dt_start;
dtprev1 = dt_start;
dtcur = dt_start;
i = 0;
%Алгоритм неявного метода Эйлера с переменным шагом и предсказанием
%начального приближения
while tcur < T
i = i + 1
tcur
n=0;
delta_Fi = [10; 10; 10; 10; 10; 10;
10; 10; 10; 10; 10; 10;
10; 10; 10; 10];
if dtcur < dt_min
dtcur = dt_min;
end
dtprev = dtcur;
dt = dtcur;
if(dt>dt_max)
dt = dt_max;
end
%Вычисление нового значения вектора переменных методом Ньютона
while (max(delta_Fi) > DeltaAccuracy)
n = n + 1;
t = tcur + dt;
delta_Fi = nodalm_jacobian(t, UIn, UIn1, dt);
UIn = UIn + delta_Fi;
if (n > Nmax) && (dt > dt_min*2)
dt = dt/2;
UIn = UIn1;
n = 0;
end
if dt < dt_min
break;
end
end
dtcur = dt;
tcur = tcur + dtcur;
%оценка погрешности интегрирования
ep_dop = 0.01 * max(UIn);
ep_m = dtcur/(dtcur + dtprev) .* (UIn - UIn1 - (dtcur/dtprev) .* (UIn1 - UIn11));
ep_m = abs(ep_m);
if (max(ep_m) < ep_dop/4)
dtcur = 2*dtcur;
end
if (max(ep_m) > ep_dop) && dtcur > dt_min
tcur = tcur - dtcur;
UIn = UIn1;
dtcur = dtcur/2;
end
UIn11 = UIn1;
UIn1 = UIn;
tValues = [tValues; tcur];
FiValues = [FiValues; UIn'];
UIn = UIn + (UIn - UIn1) .* (dtcur/dtprev);
end
%чтение результатов, полученных ПА9
PA9 = [];
fid = fopen('papa.tb9', 'rt');
str1 = fgetl( fid);
while 1
tline = fgetl(fid);
if ~ischar(tline), break, end
tnum = str2num( tline);
PA9 = [PA9; tnum];
end
fclose( fid);
plot(tValues,FiValues(:,2));
hold on;
plot(PA9(:,1),PA9(:,2),'m');
jacobian.m
function [delta_UI Jacobian F] = nodalm_jacobian(t, UIn, UIn1, dt)
%Вычисление поправки к значениям потенциалов
global R1 R2 C1 C2 C3 L It mFit Amp Tau
%Якобиан
Z = zeros(4,4);
I = eye(4,4);
M = [1 1 0 0 ;
-1 -1 1 1 ;
0 0 0 -1;
0 0 0 -1];
M1 = -M.';
K31 = [-C1/dt 0 0 0;
0 -C2/dt 0 0;
0 0 -C3/dt 0 ;
0 0 0 -It/mFit*(exp(UIn(4)/mFit)) ];
K42 = [-L/dt 0 0 0 ;
0 0 0 0 ;
0 0 -R1 0 ;
0 0 0 -R2 ];
Jacobian_ = [ I Z Z M;
Z I M1 Z;
K31 Z I Z;
Z K42 Z I];
%Правая часть уравнений
Right =[UIn(1) + UIn(13) + UIn(14);
UIn(2) - UIn(13) - UIn(14) + UIn(15) + UIn(16);
UIn(3) - UIn(16);
UIn(4) - UIn(16);
UIn(5) - UIn(9) + UIn(10);
UIn(6) - UIn(9) + UIn(10);
UIn(7) - UIn(10);
UIn(8) - UIn(10) + UIn(11) + UIn(12);
UIn(9) - C1/dt*(UIn(1) - UIn1(1));
UIn(10) - C2/dt*(UIn(2) - UIn1(2));
UIn(11) - C3/dt*(UIn(3) - UIn1(3));
UIn(12) - It*(exp(UIn(4)/mFit)-1);
UIn(13) - L/dt*(UIn(5) - UIn1(5));
UIn(14) - Amp*sin(t*2*pi/Tau);
-UIn(7)*R1 + UIn(15);
-UIn(8)*R2 + UIn(16)];
%ищем поправки к базисным переменным
deltaUI = rref([Jacobian_ -Right]);
delta_UI = deltaUI(:, 17);
Jacobian = Jacobian_;
F = Right;
end
