Составление программы, вычисляющей величину мощности напряжения в электрической цепи

Страницы работы

Содержание работы

Министерство РФ по связи и информатике. СибГУТИ.

Курсовая работа по информатике.

Тема: «Напряжение в электрической цепи, определение мощности»

Выполнил: Студент гр. В-04.

Пономарев.Е.В.

Проверил: Рягин.Б.А.

Новосибирск 2011.

Задача к курсовой работе:

Напряжение в электрической цепи описывается уравнением:

Составить программу, вычисляющую величину мощности (у2) в точках х=0.12, 0.22, 0.32, 0.42, 0.52, 0.62, 0.72, 0.82, 0.92.

Указания. Дифференциальное уравнение решить методом Рунге – Кутта на [0,1] с точностью до 10-3 . значение функций в промежуточных точках находить линейной интерполяцией.

1) Цель курсовой работы:

а) рассчитать дифференциальное уравнение второго порядка методом Рунге – Кутта;

б) определить величину мощности (Y2) в точках X=0.12, 0.22, 0.32, 0.42, 0.52, 0.62, 0.72, 0.82, 0.92.

2) Краткое теоретическое введение:

Метод Рунге – Кутта:

Решение ищется на отрезке [a; b]. Для получения решения отрезок делится на m частей точками Xi =a+(b - a)*i/m с постоянным шагом h=(b - a)/m. Пусть y(xi) - значение точного решения в точке xi ; а yi-значение приближённого решения в точке xi.

В методе Рунге – Кутта на каждом шаге i используется четыре значения углового коэффициента по следующему правилу:

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 здесь такова 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 + M*H4

Y(Xn)=Yh/2n + M*(H/2)4 |*16

16*Y(Xn)=16*Yh/2n + M*H4

Y(Xn)=Yhn + M*H4

15*Y(Xn)=16Yh/2n – Yhn=15*Yh/2n + Yh/2n - Yhn

Y(Xn) – Yh/2n=(Yh/2n - Yhn ) /15

Если разность |(Yh/2n - Yhn)/15|<E, то |Y(Xn) – Yh/2n|<E.

Линейная интерполяция:

Пусть заданы значения Yi =Y(Xi), при i=0, 1, 2, 3, …n, некоторой функции Y(X) в точках (узлах) X0 X1 X2 … Xn , расположенных на отрезке [а,b], причем X0 =a, Xn =b. Требуется приближенно востановить все значения Y(X) на отрезке[a,b] с помощью интерполяционного многочлена Ln (X) по правилу:

- в узлах Xi (I=0, 1, 2, 3,…,n): Ln(Xi)= Yi

- вне узлов, для ХÎ(a,b) и Х¹ Хi : Ln (Х)» Y(Х)

здесь n – порядок интерполяции, при n=1 рассматривается линейная интеполяция.

Каждые две соседние точки: М0М1, М1М2, М2М3,…,Мn-1Мn соединяем отрезком прямой  

Li1= Yi*(X - Xi+1)/( Xi - Xi+1) + Yi+1(X - Xi)/( Xi+1 - Xi)

В совокупности все отрезки образуют ломаную линию М0М1М2…Мn-1Мn, представляющую собой график интерполяционной кривой приближенно представляющей график искомой функции Y(X) на отрезке [a,b].

Чтобы вычислить L(Xk)»Y(Xk) в точке XkÎ[a,b], нужно определить между какими узлами Xi и Xi+1 находится Xk, т.е. Xi£Xk<Xi+1 и определено выражение:

Li1(Xk)= Yi*( Xk - Xi+1)/( Xi - Xi+1) + Yi+1(Xk - Xi)/( Xi+1 - Xi) »Y(Xk).

3) Описательная и операторная части программы

курсовой работы.

a, b – концы отрезка интегрирования;

e – погрешность счёта;

Y0 – начальное значение искомой функции;

file1.txt – файл, используемый для распечатки результатов;

PROCEDURE RK – процедура вычисления дифференциального уравнения второго порядка;

P – искомая мощность.

program cursovik;

uses crt, graph;

const a=0; b=1; e=0.001; y0=0;

type mas=array[0..2, 0..1000] of real;

k=array[1..2] of real;

var i, m, m2, i1, gt, gm, j : integer;

P, r1, r2, r3, r4, rc, x, x1, h, h1, min, max: real;

ff1 : text;

v, v1, v2 : mas;

{заданные функции}

function f1(x, y, y1 : real) : real;

begin f1:=sqr(x)/2-cos(1.4*y)*x+2.3*sqr(y1)*x; end;

function f2(x, y, y1 : real) : real;

begin f2:=x+sin(1.4*y)+2.3*sqr(y1); end;

{функции для графика}

function cx(x: real): integer;

begin cx:=round(10+(x-a)/(b-a)*300); end;

function cy(y: real): integer;

begin cy:=round(190+(y-min)/(min-max)*100); end;

{процедура Рунге-Кутта}

procedure rk(m : integer; var v1 : mas);

begin v1[1, 0]:=y0; h:=(b-a)/m;

for i:=0 to m-1 do begin

r1:=f1(a+i*h, v1[1, i], v1[2, i]);

r2:=f1(a+i*h+h/2, v1[1, i]+r1*h/2, v1[2, i]);

r3:=f1(a+i*h+h/2, v1[1, i]+r2*h/2, v1[2, i]);

r4:=f1(a+i*h+h, v1[1, i]+r3*h, v1[2, i]);

rc:=(r1+2*r2+2*r3+r4)/6;

v1[1, i+1]:=v1[1, i]+rc*h;

end; end;

{ Процедура вывода графика }

procedure gr(c, m2, j : integer; h, x: real);

begin

setcolor(c);

writeln(ff1);

for i:=1 to m2-1 do begin

line(cx(x), cy(v2[j, i]), cx(x+h), cy(v2[j, i+1]));

writeln(ff1, x :12:5, '   ', v2[j, i] :12:5);

x:=x+h;

end;

writeln(ff1, x :12:5, '   ', v2[j, m2] :12:5);

writeln;

end;

{начало программы}

begin

clrscr; m:=5;

assign(ff1, 'file1.txt'); rewrite(ff1);

repeat rk(m, v1);

m2:=2*m;

rk(m2, v2);

until abs(v2[1, m2]-v1[1,m])/15 < e;

{линейное интерполирование}

x:=a; x1:=0.02; h1:=0.1; i1:=1;

writeln(' Значения, полученные методом Рунге-Кутта ');

writeln(ff1, ' Значения, полученные методом Рунге-Кутта  ');

for i:=0 to m2 do begin

if (x1>=x) and (x1<=(x+h)) then

begin

v2[2, i1]:=v2[1, i+1]+(v2[1, i]-v2[1, i+1])*(x-x1)/h;

i1:=i1+1;

x1:=x1+h1;

end;

{ вывод значений, полученных методом Рунге-Кутта }

writeln('   ', x :3:3, '   ', v2[1, i] :3:3);

writeln(ff1, x :12:5, '   ', v2[1, i] :12:5);

x:=x+h;

end; writeln;

x:=0.12;

writeln(' Значения, полученные линейным интерполированием, искомая мощность.');

writeln(ff1, ' Значения, полученные линейным интерполированием, искомая мощность.');

for i:=1 to 10 do begin

P:=sqr(v2[2, i]);

writeln('   ', x :3:3, '   ', v2[2, i] :3:3, '   ', P :3:3);

writeln(ff1, x :12:5, '   ', v2[2, i] :12:5, '   ', P :12:5);

x:=x+h1;

end;

readln;

gt:=1; gm:=0;

initgraph(gt, gm, 'L:\bgi');

{сетка}

repeat

line(i, 5, i, 195);

i:=i+10;

until i>310;

i:=10;

repeat

line(5, i, 310, i);

i:=i+10;

until i>190;

{график}

min:=v[1, 0]; max:=min;

for i:=1 to m2 do begin

if v2[1, i] > max then max:=v2[1, i];

if v2[1, i] < min then min:=v2[1, i];

end;

writeln(ff1);

gr(1, m2, 1, h, a);

readln;

x1:=0.02;

writeln(ff1);

gr(2, 10, 2, h1, x1);

readln;

closegraph;

close(ff1);

end.

Значения, полученные методом Рунге-Кутта

X              Y

0.00000        0.00000

0.10000       -0.00483

0.20000       -0.01866

0.30000       -0.04048

0.40000       -0.06920

0.50000       -0.10370

0.60000       -0.14271

0.70000       -0.18482

0.80000       -0.22852

0.90000       -0.27215

1.00000       -0.31405

Значения, полученные линейным интерполированием, искомая мощность.

X              Y               P

0.12000       -0.00580        0.00003

0.22000       -0.02143        0.00046

0.32000       -0.04484        0.00201

0.42000       -0.07495        0.00562

0.52000       -0.11060        0.01223

0.62000       -0.15051        0.02265

0.72000       -0.19325        0.03734

0.82000       -0.23725        0.05629

Похожие материалы

Информация о работе