Вариант IX
Задание
Изменение заряда (Y) на некотором конденсаторе описывается дифференциальным уравнением:
Для данного варианта a=3, b=9.
Составить программу, вычисляющую силу тока при x=0.05, x=0.1, x=0.15 … x=0.95.
Указание: дифференциальное уравнение решить методом Рунге-Кутта с точностью 10-3. Разность Δy вычисляется для тех интервалов Δx=h, которые заключают в себе указанные точки x=0.05, x=0.1, … x=0.95. Представить распечатку заряда y для ; y’ и I для .
Решение
1-й этап. Для решения задачи Коши методом Рунге-Кутта запишем подпрограмму. Вычисление значения производной в определённых точках оформим через отдельную функцию:
function f(a,b:real):real;
begin
f:=3*sqr(a)-0.309*a*b;{f:=a;{ proverka }
end;
procedure RungeKutt(var u1,v1:massiv);
var i:integer;
begin
h:=0.2;
for i:=1 to n+1 do
begin
k1:=h*f(u1[i],v1[i]);
k2:=h*f(u1[i]+0.5*h,v1[i]+0.5*k1);
k3:=h*f(u1[i]+0.5*h,v1[i]+0.5*k2);
k4:=h*f(u1[i]+h,v1[i]+k3);
v1[i+1]:=v1[i]+(k1+2*k2+2*k3+k4)/6;
u1[i+1]:=u1[i]+h;
end; end;
Осуществляем проверку на тестовом примере, где полагаем: .5. При запуске программы получаем:
Рис.1. Тестирование программы, реализующей метод Рунге-Кутта
Значение y=1 при x=1 является доказательством правильности работы программы.
Теперь в функции указываем формулу производной из задачи. Получаем следующие результаты:
Рис.2. Значения заряда y
2-й этап. С помощью интерполирования в точках zk=0.05; 0.1; 0.15; …; 0.95, где требуется вычислить производную y’, находим соответствующие значения yk с шагом h=0.05 и вычисляем эту производную по формуле заданной в варианте (вызываем функцию f). Интерполирование заключено в процедуру Lagrange:
procedure Lagrange(u1,v1:massiv; var x,y:massiv);
var i,j:integer;
begin
for i:=2 to n do
begin
x[i]:=x[i-1]+h;
for j:=1 to n do
begin
if x[i]=u1[j] then
begin y[i]:=v1[j]; break;end else
if (x[i]>u1[j])and(x[i]<u1[j+1]) then begin
y[i]:=v1[j]*(x[i]-u1[j+1])/(u1[j]-u1[j+1])+
v1[j+1]*(x[i]-u1[j])/(u1[j+1]-u1[j]);
break;end;
end; end; end;
Рис.3. Вычисление производной заряда
3-й этап. С помощью интерполирования в точках tk=0.025; 0.075; 0.125; …; 0.975, находим соответствующие yk. Вычисляем теперь производную y’ в точках zk=0.05; 0.1; 0.15; …; 0.95 по формуле ; причём, для каждой точке zk сначала определяем интервал (ti; ti+1) такой, что ti<zk<ti+1, т.е. содержащий zk, а затем применяем формулу для данного zk.. В итоге получаем следующую программу и результаты:
Общая программа:
uses crt;
type massiv=array[1..100] of real;
var t,a,b,h,k1,k2,k3,k4:real;
i,j,l,n:integer;
x,y,u,v,x2,y2:massiv;
q:char;
function f(a,b:real):real;
begin
f:=3*sqr(a)-0.309*a*b;{f:=a;{ proverka }
end;
procedure RungeKutt(var u1,v1:massiv);
var i:integer;
begin
h:=0.2;
for i:=1 to n+1 do
begin
k1:=h*f(u1[i],v1[i]);
k2:=h*f(u1[i]+0.5*h,v1[i]+0.5*k1);
k3:=h*f(u1[i]+0.5*h,v1[i]+0.5*k2);
k4:=h*f(u1[i]+h,v1[i]+k3);
v1[i+1]:=v1[i]+(k1+2*k2+2*k3+k4)/6;
u1[i+1]:=u1[i]+h; end;
end;
procedure Lagrange(u1,v1:massiv; var x,y:massiv);
var i,j:integer;
begin
for i:=2 to n do
begin
x[i]:=x[i-1]+h;
for j:=1 to n do
begin
if x[i]=u1[j] then
begin
y[i]:=v1[j];
break;end else
if (x[i]>u1[j])and(x[i]<u1[j+1]) then begin
y[i]:=v1[j]*(x[i]-u1[j+1])/(u1[j]-u1[j+1])+
v1[j+1]*(x[i]-u1[j])/(u1[j+1]-u1[j]);
break;end;
end; end;
end;
procedure SilaToka(u1,v1:massiv; var x,y:massiv);
var i,j:integer;
begin
x[1]:=0.05;
for i:=2 to n do
begin
x[i]:=x[i-1]+h;
for j:=1 to n do
begin
if x[i]=u1[j] then
begin y[i]:=v1[j]; break;end else
if (x[i]>u1[j])and(x[i]<u1[j+1]) then begin
y[i]:=(v1[j+1]-v1[j])/(u1[j+1]-u1[j]);
break;end;
end; end;
end;
begin
clrscr;
n:=5; v[1]:=0.5; u[1]:=0;
writeln('ZARJAD po metodu Runge-Kutta: ');
u[1]:=0;v[1]:=0.5;
RungeKutt(u,v);
for i:=1 to n+1 do
writeln(u[i]:6:2,' |',v[i]:7:3);
n:=19;
writeln; writeln('Proizvodnaja zarjada'); writeln('x':4,'y':8,#39);
h:=0.05;
x2[1]:=0.05;
Lagrange(u,v,x2,y2);
for i:=1 to n do
writeln(x2[i]:6:2,f(x2[i],y2[i]):9:3); writeln;
writeln('Sila toka I'); u[1]:=0.025;
RungeKutt(u,v);
SilaToka(u,v,x2,y2);
for i:=1 to n do
writeln(x2[i]:6:2,f(x2[i],y2[i]):9:3);
readln; end.
Рис.4. Результат работы программы: заряд y, производная заряда и сила тока
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.