Мария Николова (предстои допълване на темите, превеждане на английския текст и добавяне на литературните източници)


Решаване на диференциални уравнения



страница8/10
Дата19.03.2017
Размер0.69 Mb.
#17331
1   2   3   4   5   6   7   8   9   10

Решаване на диференциални уравнения



Първи начин: Символно решаване:

The function dsolve computes symbolic solutions to ordinary differential equations. The equations are specified by symbolic expressions containing the letter D to denote differentiation. The symbols D2, D3, ... DN, correspond to the second, third, ..., Nth derivative, respectively. Thus, D2y is the Symbolic Math Toolbox equivalent of . The dependent variables are those preceded by D and the default independent variable is t. Note that names of symbolic variables should not contain D. The independent variable can be changed from t to some other symbolic variable by including that variable as the last input argument. Initial conditions can be specified by additional equations. If initial conditions are not specified, the solutions contain constants of integration, C1, C2, etc.


Пример1: Да се реши уравнението y’(t)=1+y(t)2:

Първи начин в по-новите версии:

>>syms y(t)

>>Dy=diff(y)

>> dsolve(Dy==1+y(t)^2)

ans =

tan(C3 + t)



i

-i
Или:

>> dsolve(Dy==1+y^2)

ans =


tan(C3 + t)

i

-i


Проверка на решението: диференцираме резултата за y(t) и получаваме дясната част на уравнението:

>> diff(ans)

ans =

tan(C3 + t)^2 + 1



0

0
Втори начин:

>>syms y t

>> dsolve('Dy=1+y^2')

ans =

tan(t+C1)


Тук с D се бележи производната, а С1 е константа на интегрирането
Проверка на решението: диференцираме резултата за y(t) и получаваме дясната част на уравнението. Заместваме С1 с 0, понеже е константа.

>> syms t

>> C1=0

C1 =


0

>> diff(tan(t+C1))

ans =

1+tan(t)^2 ßравно е на дясната част на уравнението



Пример 2: Да се реши горното уравнение със задаване на начално условие y(0)=1

Първи начин:

>>dsolve(Dy==1+y(t)^2,y(0)==1)

ans =

tan(pi/4 + t)


или

>> dsolve(diff(y)==1+y^2,y(0)==1)

ans =

tan(pi/4 + t)


Втори начин:

>>syms y t

>> y = dsolve('Dy=1+y^2','y(0)=1')

y =


tan(t+1/4*pi)
Трябва началното условие да се загради с апострофи и да се включи като следващ аргумент на функцията след уравнението.
Проверка на решението:

  1. Диференцираме резултата за y(t) и получаваме дясната част на уравнението.

  2. Проверяваме началното условие

>> diff(y)

ans =

1+tan(t+1/4*pi)^2 ßравно е на дясната част на уравнението


>> tan(0+1/4*pi)

ans =


1.0000 ß Вярно е началното условие

Пример 3: Да се реши уравнението х’(t)2+x(t)2=1 с начално условие x(0)=0.



Първи начин (Matlab2013b):

>> syms x(t)

>> z=dsolve(diff(x)^2+x^2==1,x(0)==0)

z =


cosh((pi*i)/2 + t*i)

cosh((pi*i)/2 - t*i)


Проверка на началното условие:

>> z2=inline(z)

z2 =

Inline function:



z2(t) = [cosh(pi.*5.0e-1i+t.*1i);cosh(pi.*5.0e-1i-t.*1i)]

>> z2(0)


ans =

1.0e-16 *

0.6123

0.6123
Явно, че z2(0)~=0, т.е. решението удовлятворява началното условие.


Втори начин:

Уравнението има 2 корена, ако се реши на по-ниската версия – Matlab6.5:



dsolve('(Dx)^2+x^2=1','x(0)=0')

ans =

[ sin(t)]

[ -sin(t)]

За да се съхранят в масив х, се задава x = dsolve('(Dx)^2+x^2=1','x(0)=0')
Проверка на решението:

  1. Заместваме резултата за x(t) в лявата страна и получаваме дясната част на уравнението.

  2. Проверяваме началното условие


>> (diff(sin(t)))^2+sin(t)^2

ans =

cos(t)^2+sin(t)^2

>> simplify(cos(t)^2+sin(t)^2)

ans =

1

Получихме дясната част на уравнението, аналогична е и проверката за -sin(t), понеже се повдига в квадрат. Ясно е, че sin(0)=0, т.е. вярно е началното условие.

За Матлаб 9 решението е:

z=dsolve('(Dx)^2+x^2=1','x(0)=0')

z =

(4*tan(t/4)*(tan(t/4)^2 - 1))/(tan(t/4)^2 + 1)^2

-(4*tan(t/4)*(tan(t/4)^2 - 1))/(tan(t/4)^2 + 1)^2

(4*tan(pi/4 + t/4)*(tan(pi/4 + t/4)^2 - 1))/(tan(pi/4 + t/4)^2 + 1)^2

(4*tan(pi/4 - t/4)*(tan(pi/4 - t/4)^2 - 1))/(tan(pi/4 - t/4)^2 + 1)^2

(4*tan(t/4 - pi/4)*(tan(t/4 - pi/4)^2 - 1))/(tan(t/4 - pi/4)^2 + 1)^2

(4*tan(- pi/4 - t/4)*(tan(- pi/4 - t/4)^2 - 1))/(tan(- pi/4 - t/4)^2 + 1)^2

Проверяваме началното условие:

z2=inline(z)

z2 =


Inline function:

z2(t) = [(4.*tan(t./4).*(tan(t./4).^2-1))./(tan(t./4).^2+1).^2;-(4.*tan(t./4).*(tan(t./4).^2-1))./(tan(t./4).^2+1).^2;(4.*tan(pi./4+t./4).*(tan(pi./4+t./4).^2-1))./(tan(pi./4+t./4).^2+1).^2;(4.*tan(pi./4-t./4).*(tan(pi./4-t./4).^2-1))./(tan(pi./4-t./4).^2+1).^2;(4.*tan(t./4-pi./4).*(tan(t./4-pi./4).^2-1))./(tan(t./4-pi./4).^2+1).^2;(4.*tan(-pi./4-t./4).*(tan(-pi./4-t./4).^2-1))./(tan(-pi./4-t./4).^2+1).^2]

>> z2(0)

ans =


1.0e-015 *

0

0



-0.2220

-0.2220


0.2220

0.2220
От отговора за z2(0) се вижда, че началното условие е изпълнено.



За по-високата версия - Матлаб 11:

>> z=dsolve('(Dx)^2+x^2=1','x(0)=0')

z =

cosh((pi*i)/2 + t*i)

cosh(- (pi*i)/2 + t*i)

cosh((pi*i)/2 - t*i)

cosh(- (pi*i)/2 - t*i
z1=inline(z)
z1 =
Inline function:

z1(t) = [cosh(pi.*5.0e-1i+t.*1i);cosh(pi.*-5.0e-1i+t.*1i);cosh(pi.*5.0e-1i-t.*1i);cosh(pi.*-5.0e-1i-t.*1i)]
>> z1(0)
ans =
1.0e-016 *
0.6123

0.6123

0.6123

0.6123
Отново решението е вярно.
Пример 4: Да се реши уравнението y’’(x)=cos(2x)-y(x) с начални условия y(0)=1 и y’(0)=0.
Първи начин (Matlab2013b):

>> syms y(x)

>> Dy=diff(y)

Dy(x) =


D(y)(x)
>> D2y=diff(y,2)

D2y(x) =


D(D(y))(x)
>> dsolve(D2y==cos(2*x)-y(x),y(0)==1,Dy(0)==0)

ans =


(5*cos(x))/3 + sin(x)*(sin(3*x)/6 + sin(x)/2) - (2*cos(x)*(6*tan(x/2)^2 - 3*tan(x/2)^4 + 1))/(3*(tan(x/2)^2 + 1)^3)
Опростяваме решението:

>> simplify(ans)

ans =

1 - (8*sin(x/2)^4)/3


Ясно е, че за х=0, и 8*sin(x/2)=0, т.е. ans=1, следователно y(0)=1 и началното условие е изпълнено.

Да проверим дали Dy(0)=0. Диференцираме:

>> z=diff(ans)

z =


-(16*cos(x/2)*sin(x/2)^3)/3

Вижда се, че z=0 за х=0. Следователно е изпълнено и второто начално условие Dy(0)=0.


Втори начин:

>> y = dsolve('D2y=cos(2*x)-y','y(0)=1','Dy(0)=0', 'x')

y =

(1/2*sin(x)+1/6*sin(3*x))*sin(x)+(1/6*cos(3*x)-1/2*cos(x))*cos(x)+4/3*cos(x)


Горният отговор е получен за Матлаб 6.5.

На Матлаб 9 се получава:

(4*cos(x))/3 + cos(x)*(cos(3*x)/6 - cos(x)/2) + sin(x)*(sin(3*x)/6 + sin(x)/2)
Сравнявайки двата отговора, се вижда, че те са еднакви, но са разместени изразите в тях и записването им е различно – напр. 4/3*cos(x) и (4*cos(x))/3
За Matlab 11:

(5*cos(x))/3 + sin(x)*(sin(3*x)/6 + sin(x)/2) - (2*cos(x)*(- 3*tan(x/2)^4 + 6*tan(x/2)^2 + 1))/(3*(tan(x/2)^2 + 1)^3)
Тъй като получения израз в y е много голям, той може да се опрости с функцията simplify от Symbolics Math Toolbox по следния начин:

За Матлаб 6.5:

>> simplify (y)

ans =


-2/3*cos(x)^2+4/3*cos(x)+1/3
Опростяването на резултата и за трите програмни системи е с еднакъв отговор, като различията са отново в мястото и записването на изразите. За Matlab 9 след simplify се получава:

(4*cos(x))/3 - (2*cos(x)^2)/3 + 1/3
За Matlab 11:

>>simplify(y)

ans =

1 - (8*(cos(x)/2 - 1/2)^2)/3
Отговорът е еднакъв с предните версии, защото ако приложим функцията expand се получава същият отговор както в Матлаб 6.5 и Матлаб 9.

>>expand(ans)

ans =

- (2*cos(x)^2)/3 + (4*cos(x))/3 + 1/3

Проверка на решението:



  1. Заместваме резултата за y(x) в лявата страна и получаваме дясната част на уравнението.

  2. Проверяваме началните условия.

Проверка в уравнението:

>> syms x

След заместване на y в дясната страна на уравнението, тя придобива вида:

>> cos(2*x)-(-2/3*cos(x)^2+4/3*cos(x)+1/3)

ans =


cos(2*x)+2/3*cos(x)^2-4/3*cos(x)-1/3
Опростяваме:

>> simplify(ans)

ans =

8/3*cos(x)^2-4/3-4/3*cos(x)


Лявата страна има вида:

>> diff(-2/3*cos(x)^2+4/3*cos(x)+1/3,2)

ans =

-4/3*sin(x)^2+4/3*cos(x)^2-4/3*cos(x)



Опростяваме:

>> simplify(ans)

ans =

8/3*cos(x)^2-4/3-4/3*cos(x)


Вижда се, че крайните резултати за лява и дясна част са еднакви, т.е. решението е вярно
Проверка на първото начално условие:

Създаваме inline функция и заместваме стойността за х в нея


>> f=inline('-2/3*cos(x)^2+4/3*cos(x)+1/3')

f =


Inline function:

f(x) = -2/3*cos(x)^2+4/3*cos(x)+1/3

>> f(0)

ans =


1
Проверка на второто начално условие:

Първо диференцираме, създаваме inline функция и заместваме стойността за х в нея


>> f2=diff(-2/3*cos(x)^2+4/3*cos(x)+1/3)

f2 =


4/3*cos(x)*sin(x)-4/3*sin(x)
>> f3=inline('4/3*cos(x)*sin(x)-4/3*sin(x)')

f3 =


Inline function:

f3(x) = 4/3*cos(x)*sin(x)-4/3*sin(x)

>> f3(0)

ans =


0

Решение на уравнението х’=-3х, начално условие х(0)=1 – стр. 58


>> syms x

>> dsolve('Dx=-3*x','x(0)=1')

ans =

exp(-3*t)


Изчертаване на графиката:

>> t=0:0.1:4

>>d=exp(-3*t)

>>plot(t,d)

>> xlabel('t')

>> ylabel('x(t)')

>> title('Symbolic Solution of the equation dx/dt=-3x(t)')


Втори начин на решаване - числено– с използване на функциите odeXX
[T,Y] = solver(odefun,tspan,y0)

[T,Y] = solver(odefun,tspan,y0,options)

where solver is one of ode45, ode23, ode113, ode15s, ode23s, ode23t, or ode23tb. Arguments


  • odefun - A function that evaluates the right-hand side of the differential equations. All solvers solve systems of equations in the form or problems that involve a mass matrix, . The ode23s solver can solve only equations with constant mass matrices. ode15s and ode23t can solve problems with a mass matrix that is singular, i.e., differential-algebraic equations (DAEs).

  • tspan - A vector specifying the interval of integration, [t0,tf]. To obtain solutions at specific times (all increasing or all decreasing), use tspan = [t0,t1,...,tf].

  • y0- A vector of initial conditions.

  • options - Optional integration argument created using the odeset function. See odeset for details.

  • p1,p2...Optional parameters that the solver passes to odefun and all the functions specified in options..

Решение на същото уравнение с помощта на ode45:

1. Записваме уравнението като функция във файл oneurawn.m в m-редактора:
function damp=oneurawn(t,x)

damp=-3*x


2. Извикваме odе45:
>>[t,х]=ode45(@oneurawn,[0 4],1)
3. Резултатите се получават в workspace в променливата t – стойности на времето t и в променливата x - стойност на функцията x(t)..Изчертаваме графиката на x(t).
>> plot(t,x)

Допълнително могат да се поставят етикети по осите х и y и заглавие на графиката с командите:


>>xlabel('t')

>> ylabel('x(t)')

>> title('Solution of the equation dx/dt=-3x(t)')
Графиката изглежда така:

Решаване на ОДУ с числени методи:

Функциите за решаване на ОДУ (т. нар. solvers) изчисляват само уравнения от първи ред. Такива функции са ode45, ode23, ode113, ode15s, ode23s, ode23t, ode23tb, bvp4c.

Но често се налага решаване на ОДУ с производни от по-висок ред от първата производна.. За да се използват тези функции трябва предварително уравненията от по-висок ред да се представят като система от диференциални уравнения от първи ред.по следния начин:



, като

В механиката производните спрямо t се бележат с точка над името на функцията, т.е. вместо y’. За да се уеднакви написаното по-долу с използваните символи в HELР-а на Matlab и други учебници по математика, навсякъде в изложението ще бъде използвано означението y’. Освен това параметърът t не е задължително да означава време, макар че най-често решението на ОДУ се търси във времевата област.Известна е формата на Коши:




където t=[t0, tf ], a t0 и tf са съответно начална и крайна точка на интервала за t. На езика на Matlab се представят като вектор [t0 tf].
ОДУ от n-ти ред може да се представи като:

Същото уравнениe се представя като система от ОДУ от първи ред като се извършат следните полагания::


В резултат се получава следната система от n уравнения:



Пример 1. Разглежда се damp system от вида:

mx’’(t)+cx’(t)+kx(t)=0 x(0)=x0 x’(0)=x’0


Това уравнение се свежда до следната система ОДУ от I ред:

х1'(t)=x2(t)

x’2(t)=-c/m*x2(t)-k/m*x1(t)
Второто уравнение от системата се получава като първо се преобразува уравнението mx’’(t)+cx’(t)+kx(t)=0 по начина:

mx’’(t)=- cx’(t)-kx(t)

и след това се раздели на m от двете страни на равенството:

x’’(t)= -c/m*x’(t)-k/m*x(t)

Замества се x’’(t) с x’2(t), след това x’(t) с x2(t) и x(t) с x1(t) и се получава ;

x’2(t)=-c/m*x2(t)-k/m*x1(t)
Задача. Да се симулира с оde45 отговорът на 3*х’’+х’+2*х=0 при начални условия х(0)=0 и х’(0)=0.25 в интервала от време 0£t£20
Уравнението е записано със функцията sdot.m. Извикването на ode45, изчертаването и надписите по фигурата са във файла sdotf.m.


файл sdot.m:

function xdot=sdot(t,x)

xdot=zeros(2,1)

xdot(1)=x(2)

xdot(2)=-(2/3)*x(1)-(1/3)*x(2)
файл sdotf.m:

[t,x]=ode45(@sdot,[0 20],[0 0.25])

plot(t,x(:,1),'-',t,x(:,2),'--')

title('Plot of displacement x(t) of the single-degree-of-freedom system')

xlabel('time t');

ylabel('Displacement x(t) and velocity dx(t)/dt');

legend('x(t)','dx(t)/dt')
Същата задача, решена символно:

>>syms x(t)

>>Dx=diff(x)

>>D2x=diff(x,2)

>>dsolve(3*D2x+Dx+2*x==0,x(0)==0,Dx(0)==0.25)
ans =

(3*23^(1/2)*exp(-t/6)*sin((23^(1/2)*t)/6))/46

>> ezplot(ans,[0 20])

Скоростта се получава като диференцираме х:

>> v=diff(ans)

v =


(exp(-t/6)*cos((23^(1/2)*t)/6))/4 - (23^(1/2)*exp(-t/6)*sin((23^(1/2)*t)/6))/92
>> ezplot(v,[0 20])






Сподели с приятели:
1   2   3   4   5   6   7   8   9   10




©obuch.info 2024
отнасят до администрацията

    Начална страница