В ML существуют средства для решения уравнений численными методами. Кроме того, есть возможность решать уравнения в символьном виде. Функция solve (expr, var) возвращает решение уравнения, задаваемого выражением expr относительно переменной var. Ищутся корни уравнения или нули выражения.
>> syms a b c x
% Решается уравнение a*x^2+b*x+c=0 отн. х
>> y=solve (a*x^2+b*x+c, x)
y =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
>> pretty(y)
+- -+
| 2 1/2 |
| b + (b - 4 a c) |
| - ------------------- |
| 2 a |
| |
| 2 1/2 |
| b - (b - 4 a c) |
| - ------------------- |
| 2 a |
+- -+
Если второй параметр не указан, то по умолчанию уравнение решается относительно х.
>> y=solve ('a*x^2+b*x+c=0')
y =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
Видим, что уравнение решается в общем виде.
Пусть задан полином, найдем корни полинома 3*x4+2*x3-x2-15*x+7 в числовом и символьном виде:
%выч. корн.пол 3*x^4+2*x^3-x^2-15*x+7
p=[3 2 -1 -15 7];
Disp('корни пол')
x=roots(p)
Disp('символьные вычисления ')
Disp('корни полинома ')
Syms x
|
|
z=solve(3*x^4+2*x^3-x^2-15*x+7)
zs=vpa(z)
Получим на экране:
корни пол
x =
-1.2505 + 1.4296i
-1.2505 - 1.4296i
1.3581
0.4762
символьные вычисления
корни полинома
z =
1.3581107410504754041265449373916
0.4762357236114296167745354966965
1.4296306305875367633296037188572*i - 1.2505065656642858437838735503774
- 1.4296306305875367633296037188572*i - 1.2505065656642858437838735503774
zs =
1.3581107410504754041265449373916
0.4762357236114296167745354966965
1.4296306305875367633296037188572*i - 1.2505065656642858437838735503774
- 1.4296306305875367633296037188572*i - 1.2505065656642858437838735503774
>> solve (2*x^3-x-1)
ans =
1
i/2 - 1/2
- i/2 - 1/2
Так же просто решаются системы уравнений. Решаемые уравнения указывают параметрами функции solve(), также можно явно указать переменные, относительно которых решается система. Например, решим систему уравнений
x^2+y^2=25
y-x=1
>> syms x y
>> [x y]=solve ('x^2+y^2=25', 'y-x=1', x, y)
x =
3
-4
y =
4
-3
У системы 2 решения: х=3, у=4 и х=-4, у=-3.
Можно в общем виде решить систему линейных уравнений
a1*x1+b1*x2=c1
a2*x1+b2*x2=c2
>> [x1, x2]=solve('a1*x1+b1*x2=c1','a2*x1+b2*x2=c2')
x1 =
(-b2*c1+c2*b1)/(-a1*b2+b1*a2)
x2 =
-(a1*c2-c1*a2)/(-a1*b2+b1*a2)
Решение дифференциальных уравнений и систем
Получить символьное решение дифференциального уравнения в ML проще, чем получить решение численными методами. Оно может быть найдено с помощью функции dsolve (expr, cond, var), в которой выражение expr описывает обыкновенное дифференциальное уравнение, cond – начальное условие, var – независимая переменная (её имя не должно начинаться с D). Если она не задана, то по умолчанию независимой переменной считается t.
Существуют правила записи дифференциального уравнения. Для обозначения операции дифференцирования используется символ D. Производная n- го порядка указывается как Dn, т.е. D = dy / dt, a D2 = d2 y / dt2.
|
|
Решим уравнение dy / dx=(y+1)/ x
Если не указывается начальные условия, то результат будет содержать неопределенные константы (постоянные) интегрирования, которые обозначаются C1, C2…
>> dsolve ('Dy=(y+1)/ x', 'x')
ans =
C2* x – 1 % С2 – постоянная интегрирования
Решим уравнение t*(1+t^2)*dx/dt = x+x*t^2-t^2 с начальным условием
x(1) =- pi/4
>> dsolve('t*(1+t^2)*Dx=x+x*t^2-t^2', 'x(1) =-pi/4')
ans =
-t* atan (t)
Решим уравнение 5y(x)+xy'(x)=x^2y(x), y(0)=2
%диф ур 5y(x)+xy'(x)=x^2y(x), y(0)=2
disp('решение диф ур')
dsolve('5*y+x*Dy=x62*y','y(0)=2')
Получим:
решение диф ур
ans =
2*exp((t*(x62 - 5))/x)
В случае уравнения второго порядка 4y''+16y'+15y=4e-3x/2 при начальных условиях у(0)=3, y’(0)=-5.5 (количество начальных условий соответствует порядку уравнения).
>> dsolve ('4*D2y+16*Dy+15*y=4*exp(-3*x/2)','y(0)=3','Dy(0)=-5.5','x')
ans =
2/exp((3*x)/2) + 2/exp((5*x)/2) + x/exp((3*x)/2) - exp(x)/exp((5*x)/2)
Можно получить в другом виде (числовом):
Vpa(ans,4)
ans =
2.0/exp(1.5*x) + 2.0/exp(2.5*x) - (1.0*exp(x))/exp(2.5*x) + x/exp(1.5*x)
Для решения системы дифференциальных уравнений в параметрах функции dsolve () указывают несколько уравнений и несколько начальных условий. Найдем решение системы x'=x+2y, y'=3x-4y с начальными условиями х(0)=1 и у(0)=2.
>> [x y]=dsolve('Dx=x+2*y','Dy=3*x-4*y','x(0)=1','y(0)=2')
x =
(10*exp (2*t)) / 7 – 3 / (7*exp (5*t))
y =
(5*exp (2*t)) / 7 + 9 / (7*exp (5*t))
Вычисление пределов
Число b называется пределом последовательности у1, у2, …уn, …, если по мере возрастания номера n член уn неограниченно приближается к b. Предел обозначается .
Для нахождения предела символьного выражения fun в точке х, стремящейся к а предусмотрена функция limit (fun, x, a).
Fun – символьная функция, х - переменная, a - точка, в которой ищется предел.
Например, предел функции (х-1)/(х+5)
Надо задать символьную переменную
>> syms x
Построим график
>> f=(x-1)/(x+5)
f =
(x-1)/(x+5)
>> ezplot(f,-10,10)
>> grid
В качестве точки предела используем inf (бесконечность)
>> limit (f, x, inf) % Предел при
ans =
1
>> limit (f, x,-inf) % Предел при
ans =
1
>> limit (f, x, -5) % Предел при
ans =
NaN
>> limit (f, x, 5) % Предел при
ans =
2/5