Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Как в 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; Нарушение авторского права страницы