Difference between revisions of "Махало"
(78 intermediate revisions by the same user not shown) | |||
Line 3: | Line 3: | ||
''' Цел: '''Създаване на връзки между диференциране и диференциални уравнения. | ''' Цел: '''Създаване на връзки между диференциране и диференциални уравнения. | ||
− | '''Постановка: ''' Математическо махало. ( Съпротивлението на въздуха се пренебрегва). | + | '''Постановка: ''' Математическо махало. (Съпротивлението на въздуха се пренебрегва). Да се намери зависимостта на махалото спрямо времето, т.е. функцията на движение на махалато. |
+ | |||
+ | '''Анализ: ''' Във всеки момент махалото се движи с различна скорост и ускорение, зависещи от ъгъла на отклонение на махалото. | ||
== Производни, разстояние, скорост и ускорение. == | == Производни, разстояние, скорост и ускорение. == | ||
Line 11: | Line 13: | ||
<math> s = \ell \theta </math> | <math> s = \ell \theta </math> | ||
− | За да изразим скоростта ползваме първата производна (изменението на разстоянието за единица време): | + | За да изразим скоростта ползваме първата [[производна]] (изменението на разстоянието за единица време). Изменя се само ъгълът, а дължината на нишката е константа и се запазва: |
+ | |||
+ | <math> v = {ds\over dt} = {{d\ell\theta}\over dt}= \ell {d\theta\over dt}</math> | ||
+ | |||
+ | По да изразим ускорението, използваме втората производна | ||
+ | |||
+ | <math> a = {d^2s\over dt^2} = \ell{d^2\theta\over dt^2} </math> (1) | ||
+ | |||
+ | == Сили действащи на махалото == | ||
+ | |||
+ | Под внимание се взема само силата действаща по посока на движението. Допирателната по окръжността на движение (тангенциалната сила ( танго -> допир)). Перпендикулярната сила (нормалната ) се неутрализира. | ||
+ | |||
+ | От [[II закон на Нютон]] <math> F = ma\,</math> | ||
+ | |||
+ | За махалото <math> F = gm \sin\theta = -ma\, => a = -g\sin\theta\, </math> (2) | ||
+ | |||
+ | == Диференциално уравнение на махало == | ||
+ | |||
+ | От (1) и (2) <math> => -g\sin\theta = \ell{d^2\theta\over dt^2} <=> \ell{d^2\theta\over dt^2} + g\sin\theta = 0 </math> | ||
+ | |||
+ | == Решаване на диференциалното уравнение == | ||
+ | Има два подхода при решаване на диференциални уравнения, аналитичен и числен. | ||
+ | При конкретното уравнение са възможни и двата подхода, но аналитичният метод може да се използва за | ||
+ | <math>\theta < 20^{\circ}</math>. В този случай диференциалното уравнение ще се преобразува в линейно от втори ред. | ||
+ | |||
+ | === Аналитично решение === | ||
+ | |||
+ | <math>\ell{d^2\theta\over dt^2} + g\sin\theta = 0 <=> \ell{d^2\theta\over dt^2} + g\theta = 0, \theta < 20^{\circ}</math> | ||
+ | |||
+ | Полагаме <math>\ {\theta} = {y} </math>, от тук <math> \ell{y''} + {g}{y} = 0 </math> - хомогенно диференциално уравнение от 2-ри ред | ||
+ | |||
+ | Уравнението е от вида <math>\ ay''+by'+cy = 0</math>, затова лесно могат да се намерят решения във вида | ||
+ | <math>\ y = c_{1} e^{r_{1} x} + c_2 e^{r_{2} x} </math>, където за ''r'' се решава уравнението <math> \ ar^{2}+br+c=0</math>, a именно: | ||
+ | |||
+ | <math> \ell r^2 + g = 0 </math> | ||
+ | |||
+ | <math> r = \pm j \sqrt{\frac{g}{l}} </math> | ||
+ | |||
+ | <math>\ y(t) = c_{1} e^{-j \sqrt{\frac{g}{l}} t} + c_2 e^{j \sqrt{\frac{g}{l}} t}</math> | ||
+ | |||
+ | <math>\ e^{jx} = cos(x) + j sin(x) </math> от тук => | ||
+ | |||
+ | <math>\ \theta(t) = C_{1}cos(\sqrt{\frac{g}{l}} t) + C_{2}sin(\sqrt{\frac{g}{l}} t) </math> | ||
+ | |||
+ | За получаване на конкретно решение ще зададем начални условия. Примерно в началното положение <math> \ t=0 </math>, махалото е отклонено на <math>\ \theta_{0} </math> градуса и пуснато свободно, т.е. с нулева начална скорост. | ||
+ | |||
+ | <math> | ||
+ | \begin{cases} | ||
+ | \theta(0) = \theta_{0} = C_{1}cos(\sqrt{\frac{g}{l}} 0) + C_{2}sin(\sqrt{\frac{g}{l}} 0) \\ | ||
+ | \theta(0)' = 0 = -C_{1}\sqrt{\frac{g}{l}}sin(\sqrt{\frac{g}{l}} 0) + C_{2}\sqrt{\frac{g}{l}}cos(\sqrt{\frac{g}{l}} 0) | ||
+ | \end{cases} </math> | ||
+ | => | ||
+ | <math>\ C_{1} = \theta_{0} , C_{2} = 0 | ||
+ | |||
+ | </math> | ||
+ | |||
+ | За решение на задача при малки ъгли се получава | ||
+ | |||
+ | <math> \theta(t) = \theta_{0} cos(\sqrt{\frac{g}{l}} t) </math> | ||
+ | |||
+ | <math> \sqrt{\frac{g}{l}} = \sqrt{\frac{m}{s^{2}}*\frac{1}{m}} = \frac{1}{s} = \omega * \frac{rad}{s} </math> e ъгловата скорост с която ще се движи махалото. | ||
+ | |||
+ | От тук <math>\ \theta(t) = \theta_{0} cos(\omega t) </math> | ||
+ | |||
+ | === Визуализация на решението с Matlab === | ||
+ | |||
+ | Имаме следните начални условия: | ||
+ | *<math> \ l = 5 </math> | ||
+ | *<math> \theta_{0} = 17^{\circ} </math> | ||
+ | |||
+ | <code><pre> | ||
+ | l = 5; % m | ||
+ | g = 9.8; % m/s^2 | ||
+ | theta_0 = 17; % degree | ||
+ | theta_0r = 17*pi/180 % ъгъл в радиани | ||
+ | omega = sqrt(g/l); % ъгловата скорост | ||
+ | t = 0:0.1:20; % интуитивно си избираме подходящ интервал за изследване | ||
+ | theta = theta_0r*cos(omega.*t); % Фундаментална формула, с който започва анализа на трептенията | ||
+ | |||
+ | % За тези с по-малко въображение и тези, които искат да представят резултатите на други | ||
+ | plot(t,theta); | ||
+ | xlabel('t [s]'), ylabel('theta [rad]'); | ||
+ | axis([ 0 20 -0.4 0.4]); | ||
+ | title('Matematichesko mahalo'); | ||
+ | % Само трябва да добавим съпротивление на въздуха; вятър; | ||
+ | % маса на нишката, която държи махалото; трептене на опoрната точка и да решим за всякакви начални условия. | ||
+ | </pre></code> | ||
+ | |||
+ | [[Image:mahAn.png|frame|none|center|Нито повече, нито по-малко от една синосоида]] | ||
+ | |||
+ | === Аналитично решение с Matlab === | ||
+ | Общо решение: | ||
+ | <code><pre> | ||
+ | syms g l; | ||
+ | y = dsolve('D2y = -(g/l)*y', 't') | ||
+ | |||
+ | %решение | ||
+ | % yC15*exp((t*(-g*l)^(1/2))/l) + C16/exp((t*(-g*l)^(1/2))/l) | ||
+ | |||
+ | </pre></code> | ||
+ | |||
+ | Частно решение с начални условия | ||
+ | <code><pre> | ||
+ | % l=5, g=9.8, 0.3 = 17*pi*180 | ||
+ | y = dsolve('D2y = -(9.8/5)*y','Dy(0)=0, y(0) =0.3','t') | ||
+ | |||
+ | %решение | ||
+ | % y = (3*cos((7*t)/5))/10 | ||
+ | </pre></code> | ||
+ | |||
+ | === Числено решаване с Matlab === | ||
+ | |||
+ | Решението се състои в две части. | ||
+ | Първо се създава файл - функция описваща уравнението | ||
+ | Второ изпълнява се функцията ode45(); | ||
+ | |||
+ | ''' Функция mah1 ''' | ||
+ | <code><pre> | ||
+ | function ds = mah1(t, yy, l , g) | ||
+ | % t е променливата, по която диференцираме, в случая не се ползва | ||
+ | % защото не е част от уравнението | ||
+ | % y функцията, която търсим | ||
+ | % dy e нейната първа производна | ||
+ | % d^2y/dt^2 + g/l*sin(y) = 0 - matematichesko mahalo | ||
+ | |||
+ | y = yy(1); % Тези два реда са за онагледяване, | ||
+ | dy = yy(2); % стойностите за уу може дирктно да се | ||
+ | % запишат в долните изрази. | ||
+ | |||
+ | ds(1,1) = dy; % <=> ( y(t) )' = dy(t) | ||
+ | ds(2,1) = -g/l*sin(y); % <=> ( dy(t) )' = -g/l*sin(y) | ||
+ | % ds са конкретни числови стойности | ||
+ | end | ||
+ | </pre></code> | ||
+ | |||
+ | ''' Скрипт за извикване на ode45() | ||
+ | <code><pre> | ||
+ | g=9.8; | ||
+ | l=5; | ||
+ | x0 = [17*pi/180; 0]; % начални условия | ||
+ | t = 0:0.01:20; | ||
+ | options = [] ; % за сега не ни интересуват | ||
+ | [t,x] = ode45(@mah1,t,x0,options,l,g); | ||
+ | |||
+ | plot(t, x(:,1)); % make the plot | ||
+ | title('Reshenie mat. mahalo s ode45()'); | ||
+ | </pre></code> | ||
+ | |||
+ | == [[Числено интегриране]] == | ||
+ | При численото решаване, знаем началната стойност на функцията и [[производна|начина по който тя се изменя]]. С тези входни данни, точка по точка се изчислява всяка следваща стойност на функцията. | ||
+ | |||
+ | Най-лесният алгоритъм за тази цел е [http://en.wikipedia.org/wiki/Euler_method методът на Ойлер]. | ||
+ | Ето какво образно показано изпълнява ode45() | ||
+ | |||
+ | <code><pre> | ||
+ | % Метод на Ойлер за интегриране | ||
+ | g= 9.8; l = 5; % константи | ||
+ | T = 20; % максимална стойност, до която ще интегрираме | ||
+ | dt = 0.0001; % колкото по-малко, толкова по-точно и по-бавно | ||
+ | t = 0:dt:T; % интервала, който ще разгледаме | ||
+ | points = T/dt; | ||
+ | |||
+ | %масив, където ще се съхранят всички точки | ||
+ | ydot = zeros(1,points+1); | ||
+ | y = zeros(1,points+1); | ||
+ | |||
+ | % Начални условия | ||
+ | y(1) = 17*pi/180; | ||
+ | ydot(1) = 0; | ||
+ | |||
+ | for i = 1:T/dt | ||
+ | y(i+1) = y(i) + ydot(i)*dt; | ||
+ | ydot(i+1) = ydot(i) - g/l*sin(y(i))*dt; | ||
+ | end | ||
+ | plot(t, y) | ||
+ | </pre></code> | ||
+ | |||
+ | Друг вариант | ||
+ | <code><pre> | ||
+ | g= 9.8; l = 5; % константи | ||
+ | order = 2; | ||
+ | T = 20; | ||
+ | dt = 0.0001 | ||
+ | points = T/dt; | ||
+ | %y = zeros(1,points); | ||
+ | %t = zeros(1,points); | ||
+ | |||
+ | x(1) = 17*pi/180; | ||
+ | x(2) = 0; | ||
+ | |||
+ | for i = 1:points | ||
+ | |||
+ | fxt(1) = x(2); | ||
+ | fxt(2) = - g/l*sin(x(1)); | ||
+ | |||
+ | for count = 1:order | ||
+ | x(count) = x(count) + dt*fxt(count); | ||
+ | end | ||
+ | y(i+1) = x(1); | ||
+ | t(i+1) = t(i) + 1; | ||
+ | end | ||
+ | plot(t, y) | ||
+ | </pre></code> | ||
+ | |||
+ | И вариант на C | ||
+ | <code><pre> | ||
+ | #include <stdio.h> | ||
+ | #include <math.h> | ||
+ | |||
+ | /* Variables defined here are global. */ | ||
+ | float x[2],xdot[2]; /* Define states and state derivatives */ | ||
+ | float t,dt; /* Time and integration interval global */ | ||
+ | int nstate; /* Number of states and state equations */ | ||
+ | float g = 9.8, l = 5; | ||
+ | |||
+ | /* State Equations */ | ||
+ | int state_eqns(void) | ||
+ | { | ||
+ | xdot[0] = x[1]; | ||
+ | xdot[1] = -g/l*sin(x[0]) ; | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | /* Euler Integration Algorithm */ | ||
+ | void euler(void) | ||
+ | { | ||
+ | int count = 0; | ||
+ | state_eqns(); | ||
+ | while (count<nstate) | ||
+ | { | ||
+ | x[count] = x[count] + dt*xdot[count]; | ||
+ | count = count+1; | ||
+ | } | ||
+ | t = t + dt; | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | int index,iterations; | ||
+ | float Tmax; | ||
+ | |||
+ | /* Data Input Section *******************************************/ | ||
+ | printf(" Input data for the simulation. \n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("Input the total time for your simulation.\n"); | ||
+ | scanf("%f",&Tmax); | ||
+ | |||
+ | printf("Input the sample time for your simulation.\n"); | ||
+ | scanf(" %f",&dt); | ||
+ | |||
+ | /* Initialization section ***************************************/ | ||
+ | t=0.; /* Initialize time & states*/ | ||
+ | index=0; | ||
+ | nstate=2; /* First order system - 1 state */ | ||
+ | |||
+ | x[0] = 0.2967; /* 17*pi/180 */ | ||
+ | xdot[0] = 0; | ||
+ | x[1] = 0.; | ||
+ | xdot[1] = 0.; | ||
+ | |||
+ | index = 0; | ||
+ | iterations = Tmax/dt; | ||
+ | |||
+ | /* Do simulation calculations and print results ************************/ | ||
+ | while (index<=iterations) | ||
+ | { | ||
+ | euler(); | ||
+ | printf("t(%i)=%12.4f; m(%i)=%12.4f; \n",index,t,index,x[0]); | ||
+ | index = index + 1; | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </pre></code> | ||
+ | |||
+ | '''Вариант с PHP''' | ||
+ | <code><pre> | ||
+ | |||
+ | <? | ||
+ | // Метод на Ойлер за интегриране | ||
+ | |||
+ | $g= 9.8; $l = 5; //'константи'; | ||
+ | $T = 20; //максимална стойност, до която ще интегрираме | ||
+ | $dt = 0.001; // колкото по-малко, толкова по-точно и по-бавно | ||
+ | |||
+ | |||
+ | //%масив, където ще се съхранят всички точки | ||
+ | $ydot = 0; | ||
+ | $y = array(0,0); | ||
+ | |||
+ | //% Начални условия | ||
+ | $y[1] = 17*pi()/180; | ||
+ | $ydot = 0; | ||
+ | |||
+ | for ($i = 1; $i <= $T/$dt; $i++) | ||
+ | { | ||
+ | array_push($y,($y[$i] + $ydot*$dt)); | ||
+ | $ydot = $ydot - $g/$l*sin($y[$i])*$dt; | ||
+ | } | ||
+ | |||
+ | print_r($y); | ||
− | < | + | ?> |
+ | </pre></code> | ||
+ | == Връзки == | ||
+ | [http://dw.georgievi.net/ivan/ Бифилярно махало, Пружинно махало, Физично махало] | ||
− | |||
Latest revision as of 10:10, 5 January 2013
Цел: Създаване на връзки между диференциране и диференциални уравнения.
Постановка: Математическо махало. (Съпротивлението на въздуха се пренебрегва). Да се намери зависимостта на махалото спрямо времето, т.е. функцията на движение на махалато.
Анализ: Във всеки момент махалото се движи с различна скорост и ускорение, зависещи от ъгъла на отклонение на махалото.
Contents
Производни, разстояние, скорост и ускорение.
Движението на махалото се извършва по окръжност с радиус равен на дължината на нишката, на която е окачено махалото. От тук, следва че:
За да изразим скоростта ползваме първата производна (изменението на разстоянието за единица време). Изменя се само ъгълът, а дължината на нишката е константа и се запазва:
По да изразим ускорението, използваме втората производна
(1)
Сили действащи на махалото
Под внимание се взема само силата действаща по посока на движението. Допирателната по окръжността на движение (тангенциалната сила ( танго -> допир)). Перпендикулярната сила (нормалната ) се неутрализира.
За махалото (2)
Диференциално уравнение на махало
От (1) и (2)
Решаване на диференциалното уравнение
Има два подхода при решаване на диференциални уравнения, аналитичен и числен. При конкретното уравнение са възможни и двата подхода, но аналитичният метод може да се използва за . В този случай диференциалното уравнение ще се преобразува в линейно от втори ред.
Аналитично решение
Полагаме , от тук - хомогенно диференциално уравнение от 2-ри ред
Уравнението е от вида , затова лесно могат да се намерят решения във вида , където за r се решава уравнението , a именно:
от тук =>
За получаване на конкретно решение ще зададем начални условия. Примерно в началното положение , махалото е отклонено на градуса и пуснато свободно, т.е. с нулева начална скорост.
=>
За решение на задача при малки ъгли се получава
e ъгловата скорост с която ще се движи махалото.
От тук
Визуализация на решението с Matlab
Имаме следните начални условия:
l = 5; % m
g = 9.8; % m/s^2
theta_0 = 17; % degree
theta_0r = 17*pi/180 % ъгъл в радиани
omega = sqrt(g/l); % ъгловата скорост
t = 0:0.1:20; % интуитивно си избираме подходящ интервал за изследване
theta = theta_0r*cos(omega.*t); % Фундаментална формула, с който започва анализа на трептенията
% За тези с по-малко въображение и тези, които искат да представят резултатите на други
plot(t,theta);
xlabel('t [s]'), ylabel('theta [rad]');
axis([ 0 20 -0.4 0.4]);
title('Matematichesko mahalo');
% Само трябва да добавим съпротивление на въздуха; вятър;
% маса на нишката, която държи махалото; трептене на опoрната точка и да решим за всякакви начални условия.
Аналитично решение с Matlab
Общо решение:
syms g l;
y = dsolve('D2y = -(g/l)*y', 't')
%решение
% yC15*exp((t*(-g*l)^(1/2))/l) + C16/exp((t*(-g*l)^(1/2))/l)
Частно решение с начални условия
% l=5, g=9.8, 0.3 = 17*pi*180
y = dsolve('D2y = -(9.8/5)*y','Dy(0)=0, y(0) =0.3','t')
%решение
% y = (3*cos((7*t)/5))/10
Числено решаване с Matlab
Решението се състои в две части. Първо се създава файл - функция описваща уравнението Второ изпълнява се функцията ode45();
Функция mah1
function ds = mah1(t, yy, l , g)
% t е променливата, по която диференцираме, в случая не се ползва
% защото не е част от уравнението
% y функцията, която търсим
% dy e нейната първа производна
% d^2y/dt^2 + g/l*sin(y) = 0 - matematichesko mahalo
y = yy(1); % Тези два реда са за онагледяване,
dy = yy(2); % стойностите за уу може дирктно да се
% запишат в долните изрази.
ds(1,1) = dy; % <=> ( y(t) )' = dy(t)
ds(2,1) = -g/l*sin(y); % <=> ( dy(t) )' = -g/l*sin(y)
% ds са конкретни числови стойности
end
Скрипт за извикване на ode45()
g=9.8;
l=5;
x0 = [17*pi/180; 0]; % начални условия
t = 0:0.01:20;
options = [] ; % за сега не ни интересуват
[t,x] = ode45(@mah1,t,x0,options,l,g);
plot(t, x(:,1)); % make the plot
title('Reshenie mat. mahalo s ode45()');
Числено интегриране
При численото решаване, знаем началната стойност на функцията и начина по който тя се изменя. С тези входни данни, точка по точка се изчислява всяка следваща стойност на функцията.
Най-лесният алгоритъм за тази цел е методът на Ойлер. Ето какво образно показано изпълнява ode45()
% Метод на Ойлер за интегриране
g= 9.8; l = 5; % константи
T = 20; % максимална стойност, до която ще интегрираме
dt = 0.0001; % колкото по-малко, толкова по-точно и по-бавно
t = 0:dt:T; % интервала, който ще разгледаме
points = T/dt;
%масив, където ще се съхранят всички точки
ydot = zeros(1,points+1);
y = zeros(1,points+1);
% Начални условия
y(1) = 17*pi/180;
ydot(1) = 0;
for i = 1:T/dt
y(i+1) = y(i) + ydot(i)*dt;
ydot(i+1) = ydot(i) - g/l*sin(y(i))*dt;
end
plot(t, y)
Друг вариант
g= 9.8; l = 5; % константи
order = 2;
T = 20;
dt = 0.0001
points = T/dt;
%y = zeros(1,points);
%t = zeros(1,points);
x(1) = 17*pi/180;
x(2) = 0;
for i = 1:points
fxt(1) = x(2);
fxt(2) = - g/l*sin(x(1));
for count = 1:order
x(count) = x(count) + dt*fxt(count);
end
y(i+1) = x(1);
t(i+1) = t(i) + 1;
end
plot(t, y)
И вариант на C
#include <stdio.h>
#include <math.h>
/* Variables defined here are global. */
float x[2],xdot[2]; /* Define states and state derivatives */
float t,dt; /* Time and integration interval global */
int nstate; /* Number of states and state equations */
float g = 9.8, l = 5;
/* State Equations */
int state_eqns(void)
{
xdot[0] = x[1];
xdot[1] = -g/l*sin(x[0]) ;
return 0;
}
/* Euler Integration Algorithm */
void euler(void)
{
int count = 0;
state_eqns();
while (count<nstate)
{
x[count] = x[count] + dt*xdot[count];
count = count+1;
}
t = t + dt;
return;
}
int main(void)
{
int index,iterations;
float Tmax;
/* Data Input Section *******************************************/
printf(" Input data for the simulation. \n");
printf("\n");
printf("Input the total time for your simulation.\n");
scanf("%f",&Tmax);
printf("Input the sample time for your simulation.\n");
scanf(" %f",&dt);
/* Initialization section ***************************************/
t=0.; /* Initialize time & states*/
index=0;
nstate=2; /* First order system - 1 state */
x[0] = 0.2967; /* 17*pi/180 */
xdot[0] = 0;
x[1] = 0.;
xdot[1] = 0.;
index = 0;
iterations = Tmax/dt;
/* Do simulation calculations and print results ************************/
while (index<=iterations)
{
euler();
printf("t(%i)=%12.4f; m(%i)=%12.4f; \n",index,t,index,x[0]);
index = index + 1;
}
return 0;
}
Вариант с PHP
<?
// Метод на Ойлер за интегриране
$g= 9.8; $l = 5; //'константи';
$T = 20; //максимална стойност, до която ще интегрираме
$dt = 0.001; // колкото по-малко, толкова по-точно и по-бавно
//%масив, където ще се съхранят всички точки
$ydot = 0;
$y = array(0,0);
//% Начални условия
$y[1] = 17*pi()/180;
$ydot = 0;
for ($i = 1; $i <= $T/$dt; $i++)
{
array_push($y,($y[$i] + $ydot*$dt));
$ydot = $ydot - $g/$l*sin($y[$i])*$dt;
}
print_r($y);
?>