Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Как в Matlab найти решение алгебраического или дифференциального уравнения в символьном виде? (В1Б4,В2Б16,В3Б13).



Для решения систем уравнений и одиночных уравнений служит команда

solve(expr1, expr2,..., exprN, var1, var2,..., varN). Она возвращает значения переменных varI, при которых соблюдаются равенства, заданные выражениями exprI. Если в выражениях не используются знаки равенства, то полагается, что exprI = 0.

Результат может быть возвращен в следующих формах:

для одного уравнения и одной переменной решение возвращается в виде одномерного или многомерного массива ячеек;

при одинаковом числе уравнений и переменных решение возвращается в упорядоченном по именам переменных виде.

Команда solve позволяет найти не только вещественные, но и комплексные решения систем уравнений и одиночных уравнений. Справку по этой команде можно получить, введя команду doc solve.

Пример:

Решить уравнение x3 - 1 = 0.

Решение:

> > syms x, y=x^3-1; S=solve(y)

S =

[ 1]

[ -1/2+1/2*i*3^(1/2)]

[ -1/2-1/2*i*3^(1/2)]

В результате получены три разных значения корня x1 = 1, x2 =, x3 = , которые хранятся соответственно в элементах S(1), S(2), S(3) массива S.

С помощью subs (разд. 7.7) подставим найденные значения корней в выражение x3 - 1:

> > subs(y, x, S)

ans =

[ 0]

[ (-1/2+1/2*i*3^(1/2))^3-1]

[ (-1/2-1/2*i*3^(1/2))^3-1]

> > [m]=simple(ans)

m =

[ 0]

[ 0]

[ 0]

Выражение x3 - 1 принимает значение 0 при подстановке любого из найденных корней, поэтому x1, x2, x3 являются точными корнями уравнения x3 - 1 = 0.

Команда roots (см. разд. 6.1) нашла бы только приближенные значения корней уравнения x3 - 1 = 0. В общем случае полиномиальное уравнение степени выше 4 не может иметь точного решения, выраженного с помощью радикалов.

Команда solve позволяет решать уравнения, представленные в аналитическом виде.

Пример:

Решить квадратное уравнение ax2+bx+c = 0.

Решение:

> > S=solve('a*x^2+b*x+c=0', x)

S =

[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))]

[ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]

Команда solve возвратила известные выражения корней x1, 2 = квадратного уравнения ax2+bx+c = 0. Точно также можно выразить с помощью радикалов решения кубического уравнения ax3+bx2+cx+d = 0, хотя эти выражения достаточно сложные.

Пример:

Решить трансцендентное уравнение xlnx+1 - 1 = 0.

Решение:

> > syms x

> > S=solve('x^(log(x)+1)-1', x)

S =

[ exp(0)]

[ exp(-1)]

Проверка:

> > subs(x^(log(x)+1)-1, x, S)

ans =

[ 0]

[ 0]

В данном случае solve нашла точные значения корней x1 = 1, x2 = e− 1.

Пример:

Решить трансцендентное уравнение lnx + 3 - x = 0.

Решение:

> > solve('log(x)+3-x=0')

ans =

[ -lambertw(-exp(-3))]

[ -lambertw(-1, -exp(-3))]

Команда solve возвратила значения корней, выраженные через функцию Ламберта.

Команда vpa возвращает приближенные значения этих корней, вычисленные с 20 значащими цифрами:

> > vpa(ans, 20)

ans =

[.52469097457714872410e-1]

[ 4.5052414957928833670]

Каждый из приближенных корней этого уравнения был найден по отдельности в разделе 6.2 с помощью команды fzero. Отметим, что команда solve нашла приближенные значения двух корней одновременно с высокой точностью. При этом не пришлось графически определять интервалы изоляции корней.

Решение любого трансцендентного уравнения, в том числе и тригонометрического (разд. 7.17), достаточно сложная и серьезная проблема. Иногда solve возвращает неверные решения.

Пример:

Решить трансцендентное уравнение sinxlnsinx+xx - 2 = 0.

Решение:

> > syms x

Y=sin(x)^log(sin(x))+x^x-2;

> > S=solve(Y)

S =

1/2*pi

> > subs(Y, S)

ans =

-1+(1/2*pi)^(1/2*pi)

> > vpa(ans, 5)

ans =

1.0327

Найденное решение неверное, т. к. оно не прошло проверку подстановкой.

Команда solve может возвратить не все решения.

Пример:

Решить трансцендентное уравнение sinx+lnx+ex - 1 = 0.

Решение:

> > syms x

> > Y=sin(x)+log(x)+exp(x)-1;

> > S=solve(Y);

> > vpa(S, 5)

ans =

-3.0553-1.7145*i

> > subs(Y, S)

ans =

-.8e-31-.1e-30*i

Возвратив приближенный комплексный корень уравнения x1 = -3, 0553 - 1, 7145i, solve не нашла вещественный корень. С помощью команды ezplot (разд. 7.16) графически определяем, что он находится вблизи значения 0, 4 (рис. 7.2):

> > ezplot('sin(x)+log(x)+exp(x)-1', [0, 1, -1, 3])

> > grid

 

 

Рис.7.2

Вещественный корень со стартовым приближением 0, 4 найдем с помощью команды fzero:

> > format long

> > [X, f]=fzero('sin(x)+log(x)+exp(x)-1', 0.4)

X =

0.40716029855672

f =

-2.220446049250313e-016

Итак, приближенное значение вещественного корня x2=0, 4072.

Для решения обыкновенных дифференциальных уравнений (систем уравнений) MATLAB имеет команду

r = dsolve('eq1', 'eq2',..., 'cond1', 'cond2',..., 'v').

Она возвращает аналитическое решение дифференциальных уравнений eq1, eq2,..., использующих v как независимую переменную, с граничными и (или) начальными условиями cond1, cond2,.... По умолчанию независимой переменной считается переменная t, обычно обозначающая время. Если в выражениях eqI (condI) не используется знак равенства, то полагается, что eqI (condI) = 0.

Символ D обозначает производную по независимой переменной, то есть d/dt, при этом D2 означает d2/dt2 и т. д. Имя независимой переменной не должно начинаться с буквы D.

Начальные условия задаются в виде равенств 'y(a) = b' или 'Dy(a) = b' , где у – зависимая переменная, a и b – константы, которые могут быть и символьными. Могут быть символьными и константы в уравнениях. Если число начальных условий меньше порядка уравнения, то в решении будут присутствовать произвольные постоянные C1, C2 и т. д. Формы вывода результата такие же, как и для команды solve. Справку по dsolve можно получить, введя команду doc dsolve.

Пример:

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

1) x'' = -2x', 2) y'' = -ax+y', y(0) = b, 3) y(4) - y = 5exsinx+x4, 4) y''+4y'+3y = cost, y(0) = 1, y'(0) = 0.

Решения 3 - го и 4 - го уравнений проверить подстановкой.

Решение:

> > dsolve('D2x=-2*x')

ans =

C1*cos(2^(1/2)*t)+C2*sin(2^(1/2)*t)

> > dsolve('D2y=-a*x+y', 'y(0)=b', 'x')

ans =

a*x+C1*sinh(x)+b*cosh(x)

> > syms x

> > S=dsolve('D4y-y-5*exp(x)*sin(x)-x^4', 'x');

> > [R]=simple(S)

R =

-24-x^4-exp(x)*sin(x)+C1*exp(x)+C2*sin(x)+C3*cos(x)+C4*exp(-x)

Проверка 3-го решения:

> > diff(R, x, 4)-R-5*exp(x)*sin(x)-x^4

ans =

> > S=dsolve('D2y+4*Dy+3*y=cos(t)', 'y(0)=1', 'Dy(0)=0', 't')

S =

1/10*cos(t)+1/5*sin(t)-7/20*exp(-3*t)+5/4*exp(-t)

Проверка 4-го решения:

> > syms t

> > diff(S, t, 2)+4*diff(S, t)+3*S

ans =

cos(t)

Проверка выполнения начальных условий 4 - го решения:

> > subs(S, t, 0)

ans =

> > subs(diff(S, t), t, 0)

ans =

Пример:

Решить систему линейных дифференциальных уравнений

 

 

Решение:

> > S=dsolve('Dx = y', 'Dy = -x')

S =

x: [1x1 sym]

y: [1x1 sym]

> > disp([S.x, S.y ])

[ cos(t)*C1+sin(t)*C2, -sin(t)*C1+cos(t)*C2]


Поделиться:



Последнее изменение этой страницы: 2017-03-17; Просмотров: 1115; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.028 с.)
Главная | Случайная страница | Обратная связь