Автор: Пользователь скрыл имя, 20 Декабря 2011 в 18:49, курсовая работа
Если функция y=f(x) задаётся не формулой, а таблицей, т.е. в виде отдельных значений y0, y1,…, yn в узлах x0, x1,…, xn равноотстоящих с постоянным шагом h, то при вычислении её производной y’(x) приходится пользоваться формулами численного дифференцирования.
Условие задания…………………………………………. 3
Формулы, использованные в программе……………4
Программа…………………………………………………6
Результаты (таблица)……………………………………8
Графики……………………………
Министерство РФ по связи и информатизации
Сибирский
Государственный Университет
Кафедра
ПМ и К
Курсовая работа
Тема:
«Расчет характеристик
электрической цепи»
Выполнила: студентка гр. М-62
Ваулина Е.С.
Новосибирск
2007г.
Содерж
Условие:
Измерение заряда (Y) на некотором конденсаторе, описанного дифференциальным уравнением:
Y′=1+Y*sin(x)-l*Y2
Y(0)=0,
k=0.1*a, l=0.5*(a+1)+b/1000
Составить программу, вычисляющую силу тока при
I=∆Y/∆x =∆Y/h, при х=0,05; 0,1; 0,15; … 0,95 (h=0,05).
Разность ∆Y вычисляется для тех интервалов ∆x= h, которые заключают в себе указанные точки
х=0,1; 0,2; 0,3; … 0,9.
Для сравнения провести вычисление Y′ по формуле, указанной в вариантном задании.
Представить
распечатку заряда Y
для Х, принадлежащего
[0;1]; Y′ и
I для Х,
принадлежащего [0.1; 0.9].
Формулы, используемые в программе:
Метод Рунге-Кутта – метод решения дифференциального уравнения, в котором на каждом шаге xi при вычислении yi используется четыре значения углового коэффициента:
Решение ищется на отрезке [a ; b]. Для получения решения отрезок делится на N частей точками Xi =a+(b - a)*i/N с постоянным шагом h=(b - a)/N. Пусть Y(Xi)-значение точного решения в точке Xi ; а Yi-значение приближённого решения в точке Xi .
В методе Рунге – Кутта на каждом шаге i = 0,1,2,…,(n-1) используется четыре значения углового коэффициента, которые затем усредняются, и затем делается окончательный шаг для нахождения очередного y по формулам:
K1i=F(Xi ; Yi )=Ki ;
K2i=F(Xi + H/2 ; Yi + K1i*H/2) ;
K3i=F(Xi + H/2 ; Yi + K2i*H/2) ;
K4i=F(Xi + H ; Yi + K3i*H) ;
Усредним:
KCi=(K1i + 2*K2i + 2*K3i + K4i)/6 ;
Yi+1=Yi + KCi*H; i = 0,1,2,…,(n-1)
Единичная погрешность на каждом шаге i:
Ri=Zrk*Y(5)(Ci)*H5 Xi<Ci<Xi+1.
Суммарная погрешность характеризующая вычисления Yn:
Q=Ri*N; | Y(5)(Ci)|=<M5
Max|Q|<Zrk*(b - a)M5*H4
Получим другую формулу оценки суммарной погрешности с помощью двойного пересчёта:
Y(Xn)=Yn + Zrk*(b - a)M5*H4=Yhn + P*H4 делим H на 2
Y(Xn)=Yh/2n + P*(H/2)4 |*16
16*Y(Xn)=16*Yh/2n + P*H4
Y(Xn)=Yhn + P*H4
15*Y(Xn)=16Yh/2n – Yhn=15*Yh/2n + Yh/2n - Yhn
Y(Xn) – Yh/2n=(Yh/2n - Yhn ) /15
Y(Xn) – Yh/2n=Q
Если разность
|(Yh/2n - Yhn)/15|<E,
то |Y(Xn) – Yh/2n|<E.
Интерполирование – восстановление всех значений функции по её отдельным узловым значениям с помощью интерполяционного многочлена Ln(x) по правилу: в узлах Ln(xi)=yi, вне узлов Ln(xi) y(xi). При линейной интерполяции каждые две соседние точки соединяются отрезком прямой, уравнение которой получено с помощью интерполяционного многочлена. В совокупности все отрезки представляют собой график интерполяционной кривой, приближённо представляющей график искомой функции.
Численное дифференцирование
Если функция
y=f(x) задаётся не формулой, а таблицей,
т.е. в виде отдельных значений y0,
y1,…, yn в узлах x0, x1,…,
xn равноотстоящих с постоянным шагом
h, то при вычислении её производной y’(x)
приходится пользоваться формулами численного
дифференцирования. В данной работе используется
формула
, причём
производная y’(x), вычисленная по данной
формуле, соответствует всем значениям
x в интервале
, т.е. имеет неизменное значение для
всех x, принадлежащих отрезку [xi;
xi+1], поскольку отсутствует предельный
переход и производная вычисляется сразу
для всех точек интервала, то её значение
получается здесь приближённым.
3.Используемые обозначения:
a, b – концы отрезка интегрирования;
e – погрешность счёта;
Y0 – начальное значение искомой функции;
FF1.txt – файл, используемый для распечатки результатов;
F(X, Y) – функция, являющаяся правой частью уравнения;
Procedure RK – в данной процедуре решается уравнение;
Procedure Interpol – в данной
процедуре находятся значения z[k]= 0.05, 0.1,
0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75,
0.8, 0.85, 0.9, 0.95, и значения интерполяционного
многочлена в узлах z[k].
Программа
Program variant7;
uses crt, graph ;
const a = 0 ; b = 1 ; a1 = 2 ; b1 = 7 ; l1 = 1.507; x0 = 0 ; y0 = 0 ; e = 0.01 ;
type mas = array[0..1000] of real ;
var i, k, m1, gt, gm, xm, ym: integer ;
h, x, min, max, I_1, y_1, y : real;
v1, v2, u1, u2 : mas ;
l : boolean ; f1 : text ;
function F(x, y : real ) : real;
begin
F:=1+y*sin(x)-l1*y*y;
end ;
procedure RK(m : integer; var X : mas; var Y : mas) ;
var i : integer ;
h, k1, k2, k3, k4, kc : real;
begin
h := (b - a) / m ;
X[0] := a ; Y[0] := y0;
for i := 0 to m - 1 do begin
k1 := F(a + i * h, Y[i]) ;
k2 := F(a + i * h + h / 2, Y[i] + k1 * h / 2);
k3 := F(a + i * h + h / 2, Y[i] + k2 * h / 2);
k4 := F(a + i * h + h, Y[i] + k3 * h);
kc := (k1 + 2 * k2 + 2 * k3 + k4 ) / 6 ;
X[i + 1] := a + i * h + h ;
Y[i + 1] := Y[i] + kc * h;
end ; end ;
function cx(x : real) : integer ;
begin
cx := round(10 + (x - a) / (b - a) * (xm - 20) );
end ;
function cy(y : real) : integer ;
begin
cy := round( (ym - 10) - (y - min) / (max - min) * (ym - 20) );
end ;
begin clrscr;
k := 20 ;
repeat
RK(k, v1, u1);
k := 2 * k;
RK(k, v2, u2);
l:= true;
m1 := k div 2;
if abs(u2[k] - u1[m1]) / 15 > e then
l := false ;
until l ;
m1 := k ;
assign(f1, 'kurs.txt'); rewrite(f1) ;
writeln('| x | y | y^ | I | Inter |');
writeln(f1, '| x | y | y^ | I | Inter |');
writeln('| ' , v2[0]:8:4, ' | ', u2[0]:8:4, ' |') ;
writeln(f1, '| ' , v2[0]:8:4, ' | ', u2[0]:8:4, ' |') ;
h := 0.05 ; x := h ;
while x < b do begin
for i := 1 to m1 - 1 do begin
if ( (v2[i] <= x) and (v2[i + 1] >= x) ) or
( (v2[i] >= x) and (v2[i + 1] <= x) )
then begin
y_1 := F(x, (u2[i] + u2[i + 1]) / 2 ) ;
I_1 := (u2[i + 1] - u2[i]) / (v2[i + 1] - v2[i]) ;
y:=U2[0]*(x-b)/(a-b)+U2[m1]*(
writeln('| ' ,x:8:4, ' | ', u2[i]:8:4, ' | ', y_1:8:4, ' | ', I_1:8:4, ' |', y:8:4, '|') ;
writeln(f1, '| ' ,x:8:4, ' | ', u2[i]:8:4, ' | ', y_1:8:4, ' | ', I_1:8:4, ' |', y:8:4, '|');
break ;
end ;
end ;
x := x + h ;
end;
writeln('| ' , v2[m1]:8:4, ' | ', u2[m1]:8:4, ' |') ;
writeln(f1, '| ' , v2[m1]:8:4, ' | ', u2[m1]:8:4, ' |') ;
close(f1);
readln;
min := u2[0] ;
max := u2[0] ;
for i := 1 to m1 do begin
if u2[i] < min
then min := u2[i] ;
if u2[i] > max
then max := u2[i] ;
end ;
gt := detect ;
initgraph(gt, gm, '');
xm := GetMaxX ;
ym := GetMaxY ;
setcolor (3);
i := 10 ;
repeat
line(i, 5, i, ym - 5) ;
i := i + 20 ;
until i > xm - 20 ;
i := 10 ;
repeat
line(5, i, xm - 20, i) ;
i := i + 20 ;
until i > ym - 20 ;
setcolor (5);
MoveTo( cx(v2[0]), cy(u2[0]) );
for i := 1 to m1 do
LineTo( cx(v2[i]), cy(u2[i]) );
readln ;
CloseGraph ; end.
Полученные
результаты.
| x | y | y^ | I | Inter |
| 0.0000 | 0.0000 |
| 0.0500 | 0.0250 | 0.9998 | 0.9993 | 0.0429|
| 0.1000 | 0.0749 | 0.9972 | 0.9961 | 0.0858|
| 0.1500 | 0.1247 | 0.9922 | 0.9905 | 0.1286|