Министерство общего и профессионального образования
Московский государственный институт электронной техники
(технический университет)
Кафедра проектирования и конструирования интегральных микросхем
(ПКИМC)
Лабораторные работы по курсу
"Теоретические основы систем автоматизированного проектирования".
Выполнил: студент гр. ЭКТ-32
Проверил: Петраков В.И
Москва 2002
Лабораторная работа №1
" СХЕМОTEХНИЧЕСКИЙ АНАЛИЗ ВО ВРЕМЕННОЙ ОБЛАСТИ"
ПО КУРСУ " АВТОМАТИЗАЦИЯ СХЕМОТЕХНИЧЕСКОГО ПРОЕКТИРОВАНИЯ БИС "
Цель работы - овладение навыками составления и отладки программ анализа простейших электрических цепей во временной области при помощи явного и неявного методов Эйлера решения систем обыкновенных дифференциальных уравнений.
Начальные сведения о явном и неявном методах Эйлера.
Для расчета динамического режима работы электрических цепей во
многих программах используются модели в виде систем обыкновенных
дифференциальных уравнений (ОДУ). Решение систем ОДУ основано,
как правило, на алгебраизации уравнений. В общем случае алгебраизация заключается в аппроксимации производных некоторыми выражениями для каждого шага интегрирования.
Методы численного интегрирования классифицируются: по виду получившейся системы уравнений - на явные и неявные, по величине локальной методической погрешности - на методы различных порядков точности, по изменению накопленной погрешности - на методы устойчивые и неустойчивые.
Если выражение для К+1 шага интегрирования определяется через
решения на предыдущих шагах, то такой метод относят к классу явных методов интегрирования.
Если в выражение для К+1 шага входят выражения, определяемые
решением на К+1 шаге, то метод относится к классу неявных.
Численное решение систем ОДУ - всегда приближенное.
Выделяют две группы погрешностей решения - методические погрешности, связанные со способом аппроксимации производных и погрешности округления из-за конечности разрядной сетки машины.
Ошибка для одного шага интегрирования называется локальной
погрешностью.
Порядок точности метода - величина, показывающая, с какой
скоростью стремится к "0" ошибка вычислений по сравнению с
величиной шага h.
Выражение для явного метода Эйлера для уравнения
(1)
(2)
а для неявного
(3)
В данной лабораторной работе исследование методов ведется на примере решения тестового уравнения
(4)
( Разряд конденсатора С , заряженного до напряжения U через резистор R )
Причина выбора указанного уравнения в качестве тестового
том, что оно имеет известное простое аналитическое решение,
а также в том, что процессы во многих электронных схемах носят
экспоненциальный характер.
Решение тестового уравнения явным методом Эйлера имеет вид
(5)
неявным
(6)
ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ.
Подготовить программу решения тестового уравнения
"точным" методом, а также явным и неявным методами Эйлера
для трех значений шага интегрирования:
h < 2/r , h = 2/r , h > 2/r .
Здесь r = 1/RC.
Общее число шагов интегрирования - не менее 10.
Выбирать значения R,C,U в диапазоне
R = 1 - 10 кОм
С = 1 - 10 пФ
U = 1 - 5 В
Провести анализ полученных результатов. Обьяснить полученные
зависимости.
Листинг программы на С++.
#include
#include<сmath>
using namespace std;
const int N=50
int main()
{
double R=1000.0,C=1e-11,U=5.0;
double r=1/(R*C),h=1e-9,u1,u2=U,u3=U;
cout<<"
i "<<" u1 "<<" u2 "<<"
u3 "<
for(int
i=1;i
{
u1=U*exp(-i*h/r);
u2=u3*(1-h*r);
u3=u3/(1+h*r);
cout<
}
return
0;
}
Примечание:
использовалась программа "Visual C++ 6.0"
с компилятором Borland C++
Данная
программа выводит значения напряжений
по шагам.
Лабораторная
работа №2
"
РАСЧЕТ СТАТИЧЕСКОГО РЕЖИМА "
ПО
КУРСУ " АВТОМАТИЗАЦИЯ СХЕМОТЕХНИЧЕСКОГО
ПРОЕКТИРОВАНИЯ БИС "
Цель
работы - ознакомление с методами расчета
статического
режима
нелинейных схем.
Для
расчета статического режима во многих
программах анализа используются
сравнительно быстрые методы решения
систем трансцендентных уравнений вида
(1).
Решение
данной системы уравнений Y* обращает ее
в систему тождеств
Мы
будем рассматривать численные методы
решения системы (1),
которые
позволяют получить приближенное решение
Y*, такое что
,
где
- заданная точность расчета.
В
данной лабораторной работе для
первоначального знакомства с методами
расчета статического режима будет
рассматриваться только одномерный
случай системы (1), т.е. случай, когда
решается только одно нелинейное
уравнение.
Наиболее
распространенными итерационными
методами решения указанной системы
нелинейных уравнений (1) являются метод
Ньютона и его
модификации.
Для
решения уравнения (1) методом Ньютона
необходимо задаться
некоторым
начальным приближением Xo и искать
решение, выполняя итерации по формуле
(2)
где
частная производная F по Y.
Если
,
то численный метод сходится.
В
данной лабораторной работе исследуются
три модификации метода Ньютона для
схемы делителя напряжения V из резистора
R и диода D c моделью.
(3)
Здесь - Io обратный тепловой ток диода,
МФт - температурный потенциал, U -
напряжение на диоде.
Для
данной схемы уравнение, сформированное
методом узловых
потенциалов,
имеет вид:
(4)
а
его решение методом Ньютона
(5)
где
(6)
Критерием
достижения решения с заданной точностью
может
служить выражение
|D|<
E (7)
Здесь
E - заданная точность.
Для
повышения вероятности сходимости
используются несколько
модификаций
метода, основанных на том что в ф-ле (5)
берется не вся прибавка D , а только ее
часть
(8)
где
а - обычно меньше 1.
В
лабораторной работе используются две
модификации метода
Ньютона
( метод Ньютона-Рафсона ):
1.
а =0.01 в течение всего процесса
|
1, если |D| < C (9)
2.
а= |
|
C/D, если |D| > C (10)
здесь
C - некоторая константа, остающаяся
неизменной
в
течение всего итерационного процесса.
ЗАДАНИЕ
НА ЛАБОРАТОРНУЮ РАБОТУ.
Написать
программу решения уравнения (5) на одном
из
алгоритмических
языков, реализующих метод Ньютона и
его
модификации.
В
качестве начальных приближений при
решении задачи взять
Uo=0
, Uo=0.6 , Uo=0.7
для
каждой модификации метода.
Провести
анализ полученных результатов.
Исходные
данные
V
= 3 - 5 В
R
= 1 - 3 Ом
Io
= 1.2E-10 A
MФт
= 0.025 v
E
= 0.0001
C
= 0.1 - 0.8 v
N
= 100 ( максимальное число итераций)
Листинг
программы на С++.
#include
#include<сmath>
using
namespace std;
const
int N=100;
int
main()
{
double
V=5.0,R=1.0,I0=1.2e-10,ft=0.026,e=0.0001,C=.05.u=0.0,a=.01;
double
D=1;
while(D>e)
{
D=((V-u)/R-
I0*(exp(u/ft)- 1))/(1/R+ I0*exp(u/ft));
u=u+D;
// u=u+a*D;
// if(D
// u=u+D;
// else
u+=C;
}
cout<
}
Лабораторная
работа №3
ДВУМЕРНЫЙ
СЛУЧАЙ
ПО
КУРСУ " АВТОМАТИЗАЦИЯ СХЕМОТЕХНИЧЕСКОГО
ПРОЕКТИРОВАНИЯ БИС "
Цель
работы - методы расчета статического
режима нелинейных схем.
Основная
часть цепи идентична цепи из Лабораторной
работы №2. Добавились 2 резистора -
получилась схема с 3-мя узлами - 2 уравнения
по МУП.
ЗАДАНИЕ
НА ЛАБОРАТОРНУЮ РАБОТУ.
Написать
программу решения системы уравнений
на одном из
алгоритмических
языков, реализующих метод Ньютона.
Листинг
программы на С++.
#include
#include
<сmath>
int
main()
{
int
i=1;
double
R1 = 1,R2 = 1,R3 = 3,V = 10,e = 0.001,ft = 0.025, Io=1.2e-10,
F1
= 0,F2 = 0,a11,a12,a21,a22,x1,x2,b1 b2,a,c = 0.1;
while(fabs(x1)>e
&& fabs (x2)>e)
{
a11
= -1/R1 - 1/R2 - 1/R3;
a21
= a12 = 1/R3;
a22
= -1/R3 - Io/ft*exp(F2/ft);
b1
= -F2/R2 - (F1-V)/R1 - (F1-F2)/R3;
b2
= (F1-F2)/R3 - Io*(exp(F2/ft)-1);
x1
= (-b1*a22+b2*a12)/(a11*a22-a21*a12);
x2
= (-a11*b2+b1*a21)/(a11*a22-a21*a12);
if
(fabs(x1)>c) { a = c/x1; }
else
{ a = 1; }
F1
= F1 + a*x1;
F2
= F2 + a*x2;
i++;
}
cout<<"F1="<
cout<<"Chislo
shagov: "<
return
0;
}
Лабораторная
работа №4
ИССЛЕДОВАНИЕ
ПЕРЕХОДНЫХ ПРОЦЕССОВ
ПО
КУРСУ " АВТОМАТИЗАЦИЯ СХЕМОТЕХНИЧЕСКОГО
ПРОЕКТИРОВАНИЯ БИС "
Цель
работы - методы расчета переходных
процессов нелинейных схем.
Основная
часть цепи идентична цепи из Лабораторной
работы №3. Добавился 1 конденсатор.
Исследуем
переходные процессы, вызванные
воздействием следующего импульса.
Очевидно,
что при
мы
выходим на стационарный процесс.
Получается так называемое исследование
статики через динамику.
ЗАДАНИЕ
НА ЛАБОРАТОРНУЮ РАБОТУ.
Написать
программу решения системы уравнений
на одном из
алгоритмических
языков, реализующих метод Ньютона.
Листинг
программы на С++.
#include
#include
<сmath>
int
main()
{
int
i=1;
double
R1 = 1,R2 = 1,R3 = 3,V = 10,e = 0.001,ft = 0.025, Io=1.2e-10,
F1
= 0,F2 = 0,a11,a12,a21,a22,x1,x2,b1 b2,a1,a2,c = 0.1,C=1e-11;
while(fabs(x1)>e
&& fabs (x2)>e)
{
a11
= -1/R1 - 1/R2 - 1/R3;
a21
= a12 = 1/R3;
a22
= -1/R3 - Io/ft*exp(F2/ft);
b1
= -F2/R2 - (F1-V)/R1 - (F1-F2)/R3;
b2
= (F1-F2)/R3 - Io*(exp(F2/ft)-1)-C/h*F1+C/h*F2;
x1
= (-b1*a22+b2*a12)/(a11*a22-a21*a12);
x2
= (-a11*b2+b1*a21)/(a11*a22-a21*a12);
if
(fabs(x1)>c) { a1 = c/x1; }
else
{ a1 = 1; }
if
(fabs(x1)>c) { a 2= c/x1; }
else
{ a2 = 1; }
F1
= F1 + a1*x1;
F2
= F2 + a2*x2;
i++;
}
cout<<"F1="<
cout<<"Chislo
shagov: "<
return
0;
}