Тема-3-5. Основы работы с математическими пакетами (MathCad)
![]()
|
Тема 3.5. Основы работы с математическими пакетами Страница 347 Необходимо обратить внимание на то, что MatLab производит вычисления с представлением чисел в формате с плавающей точкой двойной точности (double ), в то время как пакет Symbolic стремится представить числа в наиболее точном виде, то есть в целом или рациональном виде. Необходимо также обратить внимание и на то, что результат символьных преобразований отображается при выводе без отступа, которым сопровождается выдача иных результатов. Это позволяет сразу опознать его как символьный, в отличие от обычных численных результатов. Для создания группы символьных объектов служит команда syms: syms argl arg2 ... Например, набор команд Пример 3.5.3-75 >>a=sym('a '); >>b=sym('b'); >>c=sym('c'); >>x=sym('x '); >> соответствует следующей команде >>syms a b c x; >> Рассмотрим еще один пример на применение команды syms. Пример 3.5.3-76 >>syms x y1 y2 >>y1=sin(x)^2; >>y2=cos(x)^2; >>y1+y2 ans= sin(x)^2+cos(x)^2 >> Для работы с действительными и комплексными числами существует ряд /возможностей. Прежде всего, это применение опций 'real', 'unreal', 'imag'. Например, Пример 3.5.3-77 >>x=sym('x' , real); >>y=sym('y', real); >>z=x+i*y z= x+i*y >>real(z) ans= x >>imag(z) ans= y >> Функции real(z) и imag(z) обеспечивают выделение действительной и мнимой частей комплексного числа z. Тема 3.5. Основы работы с математическими пакетами Страница 348 Снятие наложенных ограничений на возможные значения переменных, например, определенной выше действительной переменной х, осуществляется командой Пример 3.5.3-78 >>sym 'x', 'unreal' % или >>syms x unreal что делает переменную х не вещественной. Из вышеприведенных примеров видно, что создание символьного выражения осуществляется командой sym('символьное_выражение ') Символьные выражения стоятся на основе переменных, констант, арифметических операторов и функций – как встроенных, так и определяемых пользователем. В выражениях могут использоваться арифметические операции. В общем случае это векторные и матричные операции. Например, - Пример 3.5.3-79 >> sym x a b >> f=(sin(x)+a)^2*(cos(x)+b^2/sqrt(abs(a+b)) f=(sin(x)+a)^2*(cos(x)+b^2/sqrt(abs(a+b)) В математических выражениях могут использоваться как обычные, так и символьные переменные. Функция findsym(S) позволяет выделить символьные переменные в составе выражения S. Она возвращает в алфавитном порядке список всех символьных переменных выражения S. При отсутствии таковых возвращается пустая строка. Например: Пример 3.5.3-80 >>sym x, z, y >> а =2; b = 4 ; >> findsym (a*x^2 + b*y + z) ans = х, у, z >>findsym(a + b + x + y + z,) ans = х, у, z >> Символьные переменные могут быть элементами матриц и векторов, причем с ними можно выполнять различные операции. Например, Пример 3.5.3-81 >>sym a b c d >>M=[a b; c d] M= [ a, b] [ c, d] >> inv(M) ans= [ d/(a*d-b*c), -b/(a*d-b*c)] -c/(a*d-b*c), a/(a*d-b*c)] >> Тема 3.5. Основы работы с математическими пакетами Страница 349 MatLab в отличие от современных систем MathCAD, Maple или Mathematica, пока не способна выводить выражения и результаты их преобразований в естественной математической форме с использованием общепринятых спецзнаков для отображения интегралов, сумм, произведений и т. д. Тем не менее, некоторые ограниченные текстовым форматом возможности близкого к математическому виду вывода, обеспечивает функция pretty(S) . Она позволяет вывести выражения S в формате, приближенном к математическому выражению, например, Пример 3.5.3-82 >> sym x a b >> f=(sin(x)+a)^2*(cos(x)+b)^2/sqrt(abs(a+b)) f=(sin(x)+a)^2*(cos(x)+b)^2/sqrt(abs(a+b)) >>pretty(f) 2 2 (sin(x) + a) (cos(x) + b) ------------------------------- 1/2 | a + b | >> Символьные операции позволяют находить или точные значения выражения, или значения со сколь угодно большой точностью. Как известно, для преобразования значения числовой переменной в символьную служит функция sym(). Причем, при переходе от числовых к символьным выражениям по умолчанию используется запись чисел в виде рациональной дроби. Использование рациональных дробей при выполнении символьных вычислений означает, что всегда получается точный результат, не содержащий погрешность округления. Для вычисления символьного выражения с заданной точностью предназначена функция vpa( ): vpa(символьная _переменная, число значащих цифр) По умолчанию результат этой функции содержит 32 значащие цифры. Второй аргумент vpa() задает число значащих цифр только для данного вызова этой функции. Для глобальной установки применяется функция digits(), во втором аргументе которой указывается требуемое количество цифр. Функция digits() служит для установки числа цифр в числах арифметики произвольной точности (по умолчанию 32). Пример 3.5.3-82 >>digits Digits = 32 >>vpa(pi) ans = 3.1415926535897932384626433832795 >>digits(5) >> pi ans = 3.1416 >>vpa(pi,3) ans = 3.14 >> Тема 3.5. Основы работы с математическими пакетами Страница 350 Для проведения вычислений в арифметике произвольной точности служит функция vpa( ): ∂ R = vpa(S) — возвращает результат вычислений каждого элемента символьного массива S, используя арифметику произвольной точности с текущим числом цифр D, установленным функцией digits. Результат R имеет тип sym. ∂ vpa(S,D) — возвращает результат вычислений каждого элемента массива S, используя арифметику произвольной точности с количеством знаков чисел D. Пример 3.5.3-83 >>vpa(exp(1),50) ans = 2.7182818284590450907955982984276488423347473144531 >> 3.5.3.3.3 Упрощение выражений, подстановки и разложение на множители Для упрощения выражений в MatLaв общего вида используются функции simple() и simplify(S). Функция simplify(S) реализует мощный алгоритм упрощения символьных выражении массива S, содержащих как тригонометрические, экспоненциальные и логарифмические функции, так и специальные. Алгоритм, заложенный в simplе(S), пытается получить выражение, которое представляется меньшим числом символов, чем исходное. Если упрощение невозможно, то возвращается исходное выражение. Например: Пример 3.5.3-84 >>syms a b x; >>V=[sin(х)^2 + соs(х)^2 log(a*b)] >>simplify(V) ans = [ 1, log(a*b)] >>simplify((a^2 - 2*a*b + b^2) / (a - b)) ans = a – b >> Для расширения (раскрытия скобок) выражений используется функция expand(S). Эта функция расширяет выражения, входящие в массив S. Рациональные выражения она раскладывает на простые дроби, полиномы — на полиномиальные разложения и т. д. Функция работает со многими алгебраическими и тригонометрическими функциями. Например: Пример 3.5.3-85 >>syms a b x; >>S=[(x + 2)*(x + 3)*(x + 4) sin(2*x)]; >>expand(S) ans = [ x^3 + 9*x^2 + 26*x + 24 , 2*sin(x)*cos(x)] >>expand(sin(a + b)) ans = sin(a)*cos(b) + cos(a)*sin(b) >>expand((a + b)^3) ans = а^3 + 3*а^2*Ь + 3*а*Ь^2 + Ь^3 >> Тема 3.5. Основы работы с математическими пакетами Страница 351 Одной из самых эффектных и часто используемых операций символьной математики является операция подстановки. Она реализуется функцией subs(), имеющей несколько различных форм записи: ∂ subs(S) - заменяет в символьном выражении S все переменные их символьными значениями, которые берутся из вычисляемой функции или рабочей области системы MatLaв. ∂ subs(S,NEW) - заменяет все свободные символьные переменные в S из списка NEW. ∂ subs (S, OLD, NEW) — заменяет OLD на NEW в символьном выражении S. При одинаковых размерах массивов OLD и NEW замена идет поэлементно. Если в S OLD - скаляры, a NEW - числовой массив или массив ячеек, то скаляры расширяются до массива результатов. Пример 3.5.3-86 >> syms a b x у; >>subs(x - y, y, l) ans = x - l >> subs(sin(x) + cos(y), [x,y], [a,b]) ans = sin(a)+cos(b) >> 1. Обращение функции – finverse( ) Часто возникает необходимость в задании функции, обратной по отношению к заданной функции f . Для этого в Symbolic имеется функция обращения finverse, которая задается в двух формах: ∂ g = finverse(f) – возвращает функцию, обратную к f. Считается, что f – функция одной переменной, например 'х'. Тогда g(f(x)) = х. ∂ g = finverse(f,v) – возвращает функцию, обратную к f, относительно заданной переменной v, так что g(f(v)) = v. Эта форма используется, если f – функция нескольких переменных. Пример 3.5.3-87 >> syms х >> finverse(sinh(x)) ans = asnnh(x) >> finverse(exp(x)) ans = log(x) >> 2. Суперпозиция функций – compose( ) compose(f, g) – возвращает f(g(y)), где f = f(x) и g = g(y). Независимые переменные х и у находятся с помощью функции findsym( ). 3. Функция разложения в ряд Тейлора – taylor( ) ∂ taylor (f) – возвращает шесть членов ряда Маклорена функции f ; ∂ taylor (f, n, x, a) – возвращает n членов ряда Тейлора в точке х = а ; ∂ taylor (f, n) – возвращает ( n - 1) членов ряда Маклорена функции f ; ∂ taylor (f, a) – возвращает шесть членов ряда Тейлора функции f в точке а. Тема 3.5. Основы работы с математическими пакетами Страница 352 Пример 3.5.3-88 >>x = sym(‘x’) >>taylor(sin(x)) ans = x – 1/6*x^3 + 1/120*x^5 >>taylor(int(sin(x)) ans = - 1 +1/2*x^2 – 1/24*x^4 >> Для разложения выражения на простые множители используется функция factor(S). Эта функция поэлементно разлагает выражения вектора S на простые множители, а целые числа - на произведение простых чисел. Следующие примеры иллюстрируют применение функции: Пример 3.5.3-89 >> x=sym('х'); >>factor(x^7-l) ans = ( х – 1 )*( х^6 + х^5 + х^4 + х^3 + х^2 + х + 1 ) >>factor(х^2 – х - 1) ans = х^2 – х - 1 >>factor(sym('123456789')) ans = (3 )^2*(3803)*(3607) >> 1. Комплектование по степеням – collect( ) Функция collect(S,v) обеспечивает комплектование выражений в составе вектора или матрицы S по степеням переменной v. 2. Упрощение выражений – simple( ) Функция simple(S) выполняет различные упрощения для элементов массива S и выводит как промежуточные результаты, так и самый короткий конечный результат. В другой форме – [R, HOW] = simple(S) – промежуточные результаты не выводятся. 3. Приведение к рациональной форме – numden( ) Функция [N,D] = numden(A) преобразует каждый элемент массива А в рациональную форму в виде отношения двух неприводимых полиномов с целочисленными коэффициентами. При этом N и D — числители и знаменатели каждого преобразованного элемента массива. Пример 3.5.3-90 >> [n,d] = numden(sym(8/10)) n = 4 d = 5 >>syms x y >> [ n, d ] = numden (x*y + y / x) n = y*(x^2 + 1) d = x >> 4. Функция вычисления суммы рядов – symsum( ) Для аналитического вычисления суммы ряда служит команда symsum( ): • symsum(S) – возвращает символьное значение суммы бесконечного ряда по переменной, найденной автоматически с помощью функции findsym( ); • symsum(S, v) – возвращает сумму бесконечного ряда по переменной v; Тема 3.5. Основы работы с математическими пакетами Страница 353 • symsum(S, a, b) и symsum(S, v, a, b) – возвращают конечную сумму ряда в пределах номеров слагаемых от а до b. Пример 3.5.3-91 >> [n,d] = numden(sym(8/10)) n = 4 d = 5 >>syms x y >> [ n, d ] = numden (x*y + y / x) n = y*(x^2 + 1) d = x >> >>x = sym(‘x’); >>symsum(x^2) ans = 1/3*x^3-1/2*x^2+1/6*x >>symsum([x, x^2, x^3], 1, 5) ans = [ 15, 55, 225] >> 3.5.3.3.4 Разложение функций в ряды. Вычисление сумм и произведений членов ряда Функция разложения в ряд Тейлора – taylor( ). ∂ taylor (f) – возвращает шесть членов ряда Маклорена функции f ; ∂ taylor (f, n, x, a) – возвращает n членов ряда Тейлора в точке х = а ; ∂ taylor (f, n) – возвращает ( n - 1) членов ряда Маклорена функции f ; ∂ taylor (f, a) – возвращает шесть членов ряда Тейлора функции f в точке а. Пример 3.5.3-92 >>x = sym(‘x’) >>taylor(sin(x)) ans = x – 1/6*x^3 + 1/120*x^5 >>taylor(int(sin(x)) ans = - 1 +1/2*x^2 – 1/24*x^4 >> Для аналитического вычисления суммы членов ряда служит команда symsum( ): ∂ symsum(S) - возвращает символьное значение суммы бесконечного ряда по переменной, найденной автоматически с помощью функции findsym( ); ∂ symsum(S, v) - возвращает сумму бесконечного ряда по переменной v; ∂ symsum(S, a, b) и symsum(S, v, a, b) - возвращают конечную сумму ряда в пределах номеров слагаемых от а до b. Пример 3.5.3-93 >> x = sym(‘x’); >> symsum(x^2) ans = 1/3*x^3-1/2*x^2+1/6*x >>symsum([x, x^2, x^3], 1, 5) ans = [ 15, 55, 225] >> Для аналитического вычисления произведений членов ряда служит команда: Тема 3.5. Основы работы с математическими пакетами Страница 354 Пример 3.5.3-94 >> x = sym(‘x’); >> symsum(x^2) ans = 1/3*x^3-1/2*x^2+1/6*x >>symsum([x, x^2, x^3], 1, 5) ans = [ 15, 55, 225] >> 3.5.3.3.5 Вычисление пределов, производной и дифференциала Напомним, что число L называется пределом функции f(x) в точке а, если при х, стремящимся к а (или х → а), значение функции неограниченно приближается к L. Это обозначается следующим образом: lim f(x) = L. Предел может быть конечным числом, положительной или отрицательной бесконечностью. Имеется функции (например, разрывные в точке x=a), у которых нет предела в самой точке x=a, но есть предел при x → a – 0 или при x→ a + 0, где под 0 подразумевается очень малое число. В первом случае говорят о существовании предела слева от точки x=a, а во втором – справа от этой точки. Если эти пределы равны, то существует предел функции в точке x=a. Для вычисления пределов аналитически заданной функции f(x) служит функция limit(), которая может записываться в нескольких вариантах: ∂ limit(f, x, a) – возвращает предел символьного выражения f в точке х → а; ∂ limit(f, a) – возвращает предел для независимой переменной, определяемой функцией findsym(); ∂ limit(f) - возвращает предел при a=0; ∂ limit(f, x, a, `right`) или limit(f, x, a, `left`) – возвращает предел в точке а справа или слева. Рассмотрим примеры применения этих функций. Пример 3.5.3-95 >> syms a x >> limit(sin(a*x)/(a*x)) ans = 1 >> limit(sin(a*x)/x) ans = a >> limit(2*sin(x)/x) ans = 2 >> limit(2+sin(x)/x,0) ans = 3 >> limit(tan(x),pi) ans = 0 >> limit(tan(x),pi/2) ans = NaN >> limit(tan(x),x,pi/2,'right') ans = -Inf >> limit(tan(x),x,pi/2,'left') ans = Inf >> Тема 3.5. Основы работы с математическими пакетами Страница 355 Для вычисления в символьном виде производных от выражения S служит функция diff(), которая записывается в формате d i f f ( S , ' v' ) или diff(S, sym('v')). Она возвращает символьное значение первой производной от символьного выражения или массива символьных выражений S по переменной v. Эта функция возвращает v d S d ) v ( S < ϒ Для вычисления n –й производной используется следующие форматы: ∂ diff(S, n) — возвращает n-ю (n — целое число) производную символьного выражения или массива символьных выражений S по переменной v. ∂ diff(S, v, n) и diff(S, n, v) – возвращает n-ю производную S по переменной v. Пример 3.5.3-96 >>x =sym( 'x' ); y=sym( 'у' ); >> diff(x^y) ans = х^у*y / x >>slmplify(ans) ans = x^(y-1)*y >>diff(s1n(y*x), x, 3) ans = - cos(y*x)*y^3 >>diff([x^3 sin(x) exp(x)], x) ans = [ 3*x^2, cos(x), exp(x)] >> syms x f = sin(5*x) ans = 5*cos(5*x) g = exp(x)*cos(x) diff(g) ans = exp(x)*cos(x)-exp(x)*sin(x) To take the second derivative of g, enter diff(g,2) ans = -2*exp(x)*sin(x) You can get the same result by taking the derivative twice: diff(diff(g)) ans = -2*exp(x)*sin(x) Note that to take the derivative of a constant, you must first define the constant as a symbolic expression. For example, entering c = sym('5'); diff(c) ans = 0 diff(5) ans = [] because 5 is not a symbolic expression. 3.5.3.3.6 Вычисление неопределенных и определенных интегралов Функция int( ) вычисляет неопределенные и определенные интегралы ∂ int(S) — возвращает символьное значение неопределенного интеграла от символьного выражения или массива символьных выражений S по переменной, которая автоматически определяется функцией findsym. Если S — скаляр или матрица, то вычисляется интеграл по переменной 'х'. |