Difference between revisions of "Упражнение 4. Matlab"
From Ilianko
(18 intermediate revisions by the same user not shown) | |||
Line 64: | Line 64: | ||
</math> | </math> | ||
− | === | + | === Аналитично решаване на ОДУ === |
y = dsolve('deq', 'x') - общо решение | y = dsolve('deq', 'x') - общо решение | ||
y = dsolve('deq', 'inic', 'x') - частно решение | y = dsolve('deq', 'inic', 'x') - частно решение | ||
Line 75: | Line 75: | ||
'''Пример: ''' | '''Пример: ''' | ||
+ | [[Махало#.D0.90.D0.BD.D0.B0.D0.BB.D0.B8.D1.82.D0.B8.D1.87.D0.BD.D0.BE_.D1.80.D0.B5.D1.88.D0.B5.D0.BD.D0.B8.D0.B5_.D1.81_Matlab|Махало аналитично решение ОДУ с Matlab]] | ||
ay'' + by' + cy = 2sin(x), y0(x) = y0 .... | ay'' + by' + cy = 2sin(x), y0(x) = y0 .... | ||
Line 99: | Line 100: | ||
ans = | ans = | ||
− | (x^2*sin(x*y) + 6*y^2*sin(x*y) - 2*y^6*sin(x*y) - 6*x*y*sin(x*y) - 4*x*y^7*cos(x*y) - 2*x*y^5*sin(x*y) + 2*x^2*y^4*sin(x*y) + x^2*y^8*sin(x*y))/(y^6*exp(x/y)) | + | (x^2*sin(x*y) + 6*y^2*sin(x*y) - 2*y^6*sin(x*y) - 6*x*y*sin(x*y) |
− | + | - 4*x*y^7*cos(x*y) - 2*x*y^5*sin(x*y) + 2*x^2*y^4*sin(x*y) | |
− | + | + x^2*y^8*sin(x*y))/(y^6*exp(x/y)) | |
− | + | </pre> | |
− | + | Заместване | |
− | >> subs(ans, {x,y}, {1.23, pi/2}) | + | >> subs(ans, {x,y}, {1.23, pi/2}) |
− | + | ans = | |
− | ans = | ||
− | |||
1.9785 | 1.9785 | ||
− | + | === Обединяване на стринг === | |
− | |||
>> str1 = 'x = '; | >> str1 = 'x = '; | ||
>> str2 = 'sin(pi/2)'; | >> str2 = 'sin(pi/2)'; | ||
Line 119: | Line 117: | ||
x = | x = | ||
1 | 1 | ||
− | |||
== Съставяне на функции с променлив брой рагументи == | == Съставяне на функции с променлив брой рагументи == | ||
Line 180: | Line 177: | ||
(x*y*sin(x*y))/exp(x/y) - (x*sin(x*y))/(y^3*exp(x/y)) | (x*y*sin(x*y))/exp(x/y) - (x*sin(x*y))/(y^3*exp(x/y)) | ||
</pre> | </pre> | ||
+ | |||
+ | == Решаване на интеграли == | ||
+ | |||
+ | >> syms x | ||
+ | >> int(x) | ||
+ | ans = | ||
+ | x^2/2 | ||
+ | |||
+ | Определен интеграл | ||
+ | |||
+ | >> syms a b x | ||
+ | >> int(x, a, b) | ||
+ | ans = | ||
+ | b^2/2 - a^2/2 | ||
+ | |||
+ | syms a b c d x y; | ||
+ | >> Ix = int(y*sin(x),x, a, b) | ||
+ | Ix = | ||
+ | y*(cos(a) - cos(b)) | ||
+ | >> Ixy = int(Ix, y, c, d) | ||
+ | Ixy = | ||
+ | -((c^2 - d^2)*(cos(a) - cos(b)))/2 | ||
+ | |||
+ | == Символно сумиране == | ||
+ | |||
+ | >> syms k; | ||
+ | S = symsum(1/k^2, k, 1, inf) | ||
+ | S = | ||
+ | |||
+ | pi^2/6 | ||
+ | |||
+ | == Ред на тейлор == | ||
+ | |||
+ | >> syms x y | ||
+ | >> f = 1/(x^2 + y); | ||
+ | >> tf = taylor(f , 7, x) | ||
+ | |||
+ | tf = | ||
+ | |||
+ | x^4/y^3 - x^2/y^2 - x^6/y^4 + 1/y | ||
+ | |||
+ | >> pretty(taylor(f , 7, y)) | ||
+ | 2 3 4 5 6 | ||
+ | y y y y y y 1 | ||
+ | -- - -- + --- - --- + --- - -- + -- | ||
+ | 6 8 10 12 14 4 2 | ||
+ | x x x x x x x | ||
+ | |||
+ | == Диференциране на членове на матрици == | ||
+ | <code><pre> | ||
+ | clear | ||
+ | >> syms x k | ||
+ | >> A = [sin(k*x), cos(k*x);sinh(k*x), cosh(k*x)] | ||
+ | |||
+ | A = | ||
+ | |||
+ | [ sin(k*x), cos(k*x)] | ||
+ | [ sinh(k*x), cosh(k*x)] | ||
+ | |||
+ | >> diff(A) | ||
+ | |||
+ | ans = | ||
+ | |||
+ | [ k*cos(k*x), -k*sin(k*x)] | ||
+ | [ k*cosh(k*x), k*sinh(k*x)] | ||
+ | </pre></code> | ||
+ | |||
+ | === решаване със subs === | ||
+ | първи начин | ||
+ | |||
+ | >> subs(A, {k, x} ,{ 2, pi/3}) | ||
+ | ans = | ||
+ | 0.8660 -0.5000 | ||
+ | 3.9987 4.121 | ||
+ | |||
+ | втори начин | ||
+ | |||
+ | >> k = 2; x = pi/3; | ||
+ | >> subs(A) | ||
+ | ans = | ||
+ | 0.8660 -0.5000 | ||
+ | 3.9987 4.1218 | ||
+ | |||
+ | == Решаване на обикновени диференциални уравнения с dsolve() == | ||
+ | |||
+ | >> y = dsolve('Dy+y^2 = x^(-2)', 'y(0.5) = -1', 'x') % уравнение, начално условие, решено по х | ||
+ | y = | ||
+ | (5^(1/2)/2 + 1/2)/x - 1/((5^(1/2)*x)/5 + (2*x*x^(5^(1/2))*(1/(5^(1/2) + 2) - 5^(1/2)/10))/(1/2)^(5^(1/2))) | ||
+ | |||
+ | mapl | ||
+ | |||
+ | <code><pre> | ||
+ | >> sol = dsolve('Dx=3*x+4*y, Dy = -4*x+3*y', 'x(0) = 0, y(0) = 1', 't') | ||
+ | sol = | ||
+ | |||
+ | x: [1x1 sym] | ||
+ | y: [1x1 sym] | ||
+ | |||
+ | >> sol.x | ||
+ | |||
+ | ans = | ||
+ | |||
+ | sin(4*t)*exp(3*t) | ||
+ | |||
+ | >> sol.y | ||
+ | |||
+ | ans = | ||
+ | |||
+ | cos(4*t)*exp(3*t) | ||
+ | |||
+ | >> subs(sol.x, 't', 0) | ||
+ | |||
+ | ans = | ||
+ | |||
+ | 0 | ||
+ | >> subs(sol.y, 't', 0) | ||
+ | ans = | ||
+ | 1 | ||
+ | </pre></code> | ||
+ | |||
+ | <code><pre> | ||
+ | >> y = dsolve('D3y=y', 'y(0) =1, Dy(0)=-1, D2y(0)=pi','x') | ||
+ | |||
+ | y = | ||
+ | |||
+ | (pi*exp(x))/3 - (cos((3^(1/2)*x)/2)*(pi/3 - 1))/exp(x/2) - (3^(1/2)*sin((3^(1/2)*x)/2)*(pi + 1))/(3*exp(x/2)) | ||
+ | |||
+ | >> | ||
+ | >> X = -5:0.05:5; | ||
+ | >> Y = subs(y,'x',X); | ||
+ | >> plot(X,Y), grid on | ||
+ | </pre></code> | ||
+ | |||
+ | [[Image:plot.png|frame|none|Графика в Matlab]] | ||
+ | |||
+ | == Литература == | ||
+ | |||
[[Category:Matlab]] | [[Category:Matlab]] |
Latest revision as of 06:18, 11 July 2011
Contents
Смесени частни производни
Matlab няма собствена функция. Трябва да се използват собствени програми включващи diff().
Pregled
Definirani simwolni nizowe
x = sym('x') A = sym('[a, b; c, d]'); - символна матрица eq = sym('a*x^2 + y'); syms x y a b c; f = (x+b); - всеки израз имащ символни променливи става символен
Aritmetika с променлива точност
vpa(expr), vpa(expr, 20) - rezultat с 20 значещи цифри digits(50)
Преобразовнания
А = [1/2 ....
S = sym(A) - double-> symbolic
V = vpa(S) - symbolic -> 32 бита точност
А = double(S) - symbolic -> double
Опростяване
collect() simple() subs() simplify()
sub(expr, old, new)
Линейна алгебра
det() inv() poly()
syms b1 b2 b3
b = [ b1; b2; b3] ;
x = A\B - решаване система уравнения
[v, E] = eig(A) собствени стойност - собствени честоти на трептене!
Решаване уравнения
solve(f,x) sym x y; [x y] = solve(f1, f2, x, y) - решава системата f1(x,y) = 0 ; f2(x,y) = 0
Matemati`eski анализ
limit(f, x, a); - granica na f при х клонящо към а
diff(f,x) int(f,x) - неопределен интеграл int(f,x,a,b) - определен интеграл
symsum( f(k), k , n ,m) - suma taylor( f, n, x, a ) - ред на тейлор
Аналитично решаване на ОДУ
y = dsolve('deq', 'x') - общо решение y = dsolve('deq', 'inic', 'x') - частно решение
Система ОДУ
[y1, y2, y3 ...] = dsolve = ('deq1', 'deq2', ..., 'inic1', 'inic2',... , 'x')
Пример:
Махало аналитично решение ОДУ с Matlab ay + by' + cy = 2sin(x), y0(x) = y0 ....
Диференциране
>> syms x y; >> f = exp(-x/y)*sin(x*y) f = sin(x*y)/exp(x/y) >> diff(f,x,2) % втора производна по x ans = sin(x*y)/(y^2*exp(x/y)) - (2*cos(x*y))/exp(x/y) - (y^2*sin(x*y))/exp(x/y)
>> simplify(diff(diff(f,x,2), y, 2)) ans = (x^2*sin(x*y) + 6*y^2*sin(x*y) - 2*y^6*sin(x*y) - 6*x*y*sin(x*y) - 4*x*y^7*cos(x*y) - 2*x*y^5*sin(x*y) + 2*x^2*y^4*sin(x*y) + x^2*y^8*sin(x*y))/(y^6*exp(x/y))
Заместване
>> subs(ans, {x,y}, {1.23, pi/2}) ans = 1.9785
Обединяване на стринг
>> str1 = 'x = '; >> str2 = 'sin(pi/2)'; >> str = [str1, str2] str = x = sin(pi/2) >> eval(str) x = 1
Съставяне на функции с променлив брой рагументи
function [a b] = in2out3(x,y,z)
if nargout == 1 %един изходен аргумент
switch nargin % брой входящи аргументи
case 1
a = x;
case 2
a = x+y;
case 3;
a = x +y + z;
end
else
switch nargin
case 1
a = x;
b = x*x;
case 2;
a = x+y;
b = x*x+y*y;
case 3;
a = x+y+z;
b = x*x+y*y+z*z;
end
end
end
Неограничен брой на входни и изходни параметри
function d = var(f, varargin)
% neograniчen брой променливи
n = length(varargin);
for i = 1:n
var = varargin{i} % ! индексът е с големи скоби
syms var;
end
for i = 1:n
f= diff(f,varargin{i});
end
d = f;
end
>> syms x y >> var(f,x,y) var = x var = y ans = cos(x*y)/exp(x/y) + sin(x*y)/(y^2*exp(x/y)) - ... (x*y*sin(x*y))/exp(x/y) - (x*sin(x*y))/(y^3*exp(x/y))
Решаване на интеграли
>> syms x >> int(x) ans = x^2/2
Определен интеграл
>> syms a b x >> int(x, a, b) ans = b^2/2 - a^2/2
syms a b c d x y; >> Ix = int(y*sin(x),x, a, b) Ix = y*(cos(a) - cos(b)) >> Ixy = int(Ix, y, c, d) Ixy = -((c^2 - d^2)*(cos(a) - cos(b)))/2
Символно сумиране
>> syms k; S = symsum(1/k^2, k, 1, inf) S = pi^2/6
Ред на тейлор
>> syms x y >> f = 1/(x^2 + y); >> tf = taylor(f , 7, x) tf = x^4/y^3 - x^2/y^2 - x^6/y^4 + 1/y
>> pretty(taylor(f , 7, y)) 2 3 4 5 6 y y y y y y 1 -- - -- + --- - --- + --- - -- + -- 6 8 10 12 14 4 2 x x x x x x x
Диференциране на членове на матрици
clear
>> syms x k
>> A = [sin(k*x), cos(k*x);sinh(k*x), cosh(k*x)]
A =
[ sin(k*x), cos(k*x)]
[ sinh(k*x), cosh(k*x)]
>> diff(A)
ans =
[ k*cos(k*x), -k*sin(k*x)]
[ k*cosh(k*x), k*sinh(k*x)]
решаване със subs
първи начин
>> subs(A, {k, x} ,{ 2, pi/3}) ans = 0.8660 -0.5000 3.9987 4.121
втори начин
>> k = 2; x = pi/3; >> subs(A) ans = 0.8660 -0.5000 3.9987 4.1218
Решаване на обикновени диференциални уравнения с dsolve()
>> y = dsolve('Dy+y^2 = x^(-2)', 'y(0.5) = -1', 'x') % уравнение, начално условие, решено по х y = (5^(1/2)/2 + 1/2)/x - 1/((5^(1/2)*x)/5 + (2*x*x^(5^(1/2))*(1/(5^(1/2) + 2) - 5^(1/2)/10))/(1/2)^(5^(1/2)))
mapl
>> sol = dsolve('Dx=3*x+4*y, Dy = -4*x+3*y', 'x(0) = 0, y(0) = 1', 't')
sol =
x: [1x1 sym]
y: [1x1 sym]
>> sol.x
ans =
sin(4*t)*exp(3*t)
>> sol.y
ans =
cos(4*t)*exp(3*t)
>> subs(sol.x, 't', 0)
ans =
0
>> subs(sol.y, 't', 0)
ans =
1
>> y = dsolve('D3y=y', 'y(0) =1, Dy(0)=-1, D2y(0)=pi','x')
y =
(pi*exp(x))/3 - (cos((3^(1/2)*x)/2)*(pi/3 - 1))/exp(x/2) - (3^(1/2)*sin((3^(1/2)*x)/2)*(pi + 1))/(3*exp(x/2))
>>
>> X = -5:0.05:5;
>> Y = subs(y,'x',X);
>> plot(X,Y), grid on