Главная страница
Навигация по странице:

  • Команда subs()

  • Команда solve()

  • Команда fsolve()

  • Значение Смысл

  • В. Матросов Основыработы


    Скачать 0.71 Mb.
    НазваниеВ. Матросов Основыработы
    Дата14.06.2022
    Размер0.71 Mb.
    Формат файлаpdf
    Имя файлаMaple-Book.pdf
    ТипДокументы
    #589656
    страница4 из 6
    1   2   3   4   5   6

    Вычисление
    выражений
    и
    переменных
    сложных
    типов
    Maple по умолчанию стремится производить все преобразования и вычисления с максималь- ной точностью, т.е. там, где это возможно, использовать арифметику с дробными числами.

    34
    Иногда это не совсем удобно, и необходимо получить результат в форме привычных деся- тичных чисел. Для вычисления и преобразования коэффициентов выражений, представлен- ных обыкновенными дробями, существует команда evalf()
    , аппроксимирующая дробные числа десятичными числами, а также вычисляющая выражение и константы Maple в форме числа с плавающей точкой.
    По умолчанию используется арифметика чисел с плавающей точкой с 10 значащими цифра- ми. Это значение можно изменить, переустановив системную константу
    Digits в другое значение, например,
    > Digits:=15;
    После выполнения этого оператора все последующие в сеансе Maple вычисления с плаваю- щей точкой будут производиться с 15 значащими цифрами. Обратим внимание, что имя этой системной переменной начинается с прописной буквы.
    Синтаксис команды evalf()
    следующий: evalf(f);
    evalf(f, n);
    где f
    – вычисляемое выражение, а n
    – число значащих цифр, используемых при вычислении.
    Несколько примеров этой команды приводится ниже:
    > Pi;
    π
    > evalf(Pi, 20);
    3.1415926535897932385
    > Digits:=30;
    Digits:
    =
    30
    > evalf(5/3*exp(-2)*sin(Pi/4));
    .159494160850684873267979942007
    > evalf(cos(1));
    .540302305868139717400936607443
    > evalf(3/4*x^2+1/3*x-sqrt(2), 10);
    .7500000000
    x
    2
    + .3333333333 x - 1.414213562

    35
    Maple вычисляет значение переменной простого типа равным тому алгебраическому выра- жению, которое ей присвоено, но значения переменных сложных, или составных типов (мас- сивы, таблицы, векторы), вычисляются в Maple равным имени этой переменной. Для того, чтобы выяснить действительное значение, содержащееся в такой переменной, в Maple ис- пользуется команда eval()
    Например, переменная, содержащая массив, является переменной сложного типа, и для отображения ее содержимого следует использовать команду eval()
    . В следующем примере иллюстрируется задание массива и отображение его содержимого:
    > a:=array(1..2,1..2,[ [1,2],[Pi,Pi]]);
    a:
    =






    1 2
    π π
    > a;
    a
    > eval(a);
    1 2
    π π






    Как видно из приведенного примера, простое задание в области ввода имени переменной, содержащей массив, приводит к отображению в области вывода имени самой переменной.
    Данную команду следует использовать с переменными любого сложного типа для выяснения их содержимого.
    Команда
    subs()
    При выполнении математических преобразований часто необходимо произвести замену пе- ременных в выражении, функции, уравнении и т.д., то есть вместо какой-то переменной под- ставить ее представление через некоторые другие переменные. Для этих целей в системе
    Maple существует команда subs()
    , синтаксис которой следующий: subs( старое
    _
    выражение
    = новое
    _
    выражение
    , выражение
    ); subs( s1, ... , sn, выражение
    ); где каждое из s1, ... , sn является уравнением или множеством/списком уравнений.
    (Уравнение – два выражения, соединенные знаком равенства (=).)

    36
    Первая форма команды анализирует выражение, выделяет в нем все вхождения ста
    - рое
    _
    выражение и подставляет вместо них новое
    _
    выражение
    . Вторая форма позволяет выполнить серию подстановок в выражение. Подстановки выполняются последовательно, начиная с s1
    . Это означает, что после выполнения первой подстановки, определенной урав- нением s1
    , Maple отыскивает вхождения левой части уравнения s2
    во вновь полученном выражении и заменяет каждое такое вхождение на выражение, заданное в левой части урав- нения s2
    . Если подстановки заданы в виде списка или множества уравнений, то они выпол- няются одновременно, т.е. вхождения выражений, заданных в левых частях уравнений, определяются в исходном параметре выражение. Например, после выполнения подстанов- ки subs( x=y, y=x, [x,y] ),
    исходный список
    [x,y]
    будет преобразован в
    [x,x]
    , тогда как при использовании команды subs( {x=y, y=x}, [x,y] )
    переменные x
    и y
    в списке поменяются местами: список будет иметь вид
    [y,x]
    Здесь следует немного сказать о внутреннем представлении объектов Maple. Каждый объект
    Maple, в том числе и выражение, делится на подобъекты первого уровня, которые в свою очередь, также делятся на подобъекты и т.д. Этот процесс продолжается до тех пор, пока не дойдем до базисных элементов Maple (объектов основных типов: целые, вещественные, дро- би и т.д.). В результате получается ветвящаяся, древоподобная структура представления лю- бого объекта Maple через базовые элементы. Для выражения
    x
    x
    x
    7 6
    2 8
    9
    +
    +

    древовидная структура представлена на рис. 15. Каждый подобъект соответствующего уровня отображен в рамке. Здесь также можно увидеть операции, которые выполняются между подобъектами одного уровня.
    Рис
    . 15 Представление выражения Maple в виде структуры (MF-15.GIF)

    37
    Команда nops(
    объект
    )
    определяет количество объектов первого уровня, а команда op(
    объект
    )
    выдает их в виде последовательности выражений. Эта же команда позволяет извлечь подобъекты первого уровня, указав в качестве первого параметра порядковый номер подобъекта первого уровня. Ниже представлены результаты применения этих команд к вы- ражению
    x
    x
    x
    7 6
    2 8
    9
    +
    +

    :
    > p := x^7+8*x^6+sqrt(x^2)-9;
    p
    x
    x
    x
    :
    =
    +
    +

    7 6
    2 8
    9
    > nops(p);
    4
    > s:=op(p);
    s
    x
    x
    x
    :
    ,
    ,
    ,
    =

    7 6
    2 8
    9
    > op(3,p);
    x
    2
    Теперь можно вернуться к описанию команды подстановки subs()
    . Так вот, эта команда заменяет выражение, заданное в левой части одного из первых параметров, на выражение из правой части, только если это выражение из левой части совпадает с одним из подобъектов в структурном представлении выражения, в котором производится подстановка. Такая подста- новка называется « синтаксической подстановкой». Поэтому, например, подстановка в вы- ражение
    s
    3
    вместо
    s
    2
    выражения
    1 2

    c
    с помощью команды subs(s^2=1-c^2, s^3)
    не приведет к желаемому результату.
    Однако не стоит паниковать, так как в Maple имеется команда algsubs( ста
    - рое
    _
    выражение
    = новое
    _
    выражение
    , выражение
    )
    , предназначенная для алгебра- ической подстановки и которая выполнит не решаемую командой subs вышеуказанную подстановку. Подробную информацию об этой команде можно, как всегда, получить из
    Справки Maple.
    Команда
    solve()
    Команда solve()
    одна из самых полезных команд системы аналитических вычислений
    Maple. Практически решение ни одной задачи не обходится без решения какого-нибудь уравнения или системы уравнений, неравенства или системы неравенств. Именно это и вы-

    38
    полняет вышеназванная команда. Но прежде чем перейти к синтаксису этой команды, следу- ет еще немного остановиться на типах данных, используемых в Maple.
    Мы знакомы с оператором присваивания
    :=
    , который позволяет присвоить переменной в ле- вой части числовое значение или выражение, стоящее в правой части.
    Два выражения, соединенные знаком равенства
    =
    , представляют новый тип данных Maple -
    уравнение (equation). Уравнение можно присвоить обычной переменной Maple.
    > 2*x^2+5=x+x^4;
    2 5
    2 4
    x
    x
    x
    + = +
    > whattype(");
    =
    > f:=2*x^2+5=x+x^4;
    f
    x
    x
    x
    :
    =
    + = +
    2 5
    2 4
    > whattype(f);
    =
    При проверке типа переменной, значением которой является уравнение, с помощью команды whattype()
    результатом является равенство =, означающее, что тип проверяемой пере- менной является уравнением.
    Точно также, как и при задании уравнений, два выражения, соединенные знаками
    >=
    (боль- ше или равно),
    <=
    (меньше или равно),
    >
    (больше) или
    <
    (меньше), представляют новый тип
    - неравенство (inequation).
    В Maple для хранения некоторого набора выражений и/или переменных определенного типа используется конструкция специального типа – множество (set). Для его задания достаточно заключить в фигурные скобки последовательность выражений и/или переменных:
    {m, s=x^2+s^2};
    Если переменной присвоено значение, являющееся множеством, то для получения значения элемента множества следует использовать индекс – заданный сразу же после имени пере- менной в квадратных скобках номер элемента множества. Например, чтобы получить значе- ние второго элемента множества, определенного выше, следует использовать следующую последовательность команд Maple:

    39
    > M:={m, s=x^2+s^2};
    M
    m s
    x
    s
    : { ,
    }
    =
    =
    +
    2 2
    > M[2];
    s
    x
    s
    =
    +
    2 2
    > whattype(M[2]);
    =
    > whattype(M);
    set
    Последние два оператора показывают тип переменной
    M
    и тип значения ее второго элемента, так как эта переменная является множеством.
    Во многих командах Maple в качестве параметра или в качестве получаемого значения ис- пользуется еще один тип данных – список (list), который представляет собой последователь- ность значений или выражений, заключенную в квадратные скобки:
    [m, s=x^2+s^2];
    Этот тип данных используется для хранения коэффициентов полиномов, коэффициентов разложения функций в разнообразные ряды и т.п.
    Теперь можно перейти к описанию синтаксиса команды solve()
    , позволяющей решать уравнения и системы уравнений, неравенства и системы неравенств. Ее синтаксис, как и син- таксис всех команд Maple, достаточно прост и легко запоминается: solve(
    уравнение
    , переменная
    ); solve({
    уравнение
    1,
    уравнение
    2,...},{
    переменная
    1, переменная
    2,...});
    Первая форма команды предназначена для решения одного уравнения относительно задан- ной переменной, тогда как вторая форма позволяет решать системы уравнений относительно заданных во втором параметре переменных. Обратим внимание на то, что система уравнений и ее неизвестные переменные задаются в виде множеств. Результатом в этом случае является также множество значений неизвестных в виде уравнений, тогда как в случае задания одного уравнения результатом будет выражение (в случае одного корня уравнения) или последова- тельность выражений (в случае нескольких корней). Если не задана переменная/переменные, относительно которых следует решать уравнение/систему уравнений, то Maple выдаст все

    40
    решения относительно всех неопределенных переменных в исходных уравнениях. Следую- щий пример иллюстрирует некоторые из приведенных ситуаций:
    > eq:=x^2-2*x+y^2=0;
    eq
    x
    x
    y
    :
    =

    +
    =
    2 2
    2 0
    > solve(eq,x);
    1 1
    1 1
    2 2
    +



    y
    y
    ,
    > solve({eq},x);
    {
    }, {
    }
    x
    y
    x
    y
    = +

    = −

    1 1
    1 1
    2 2
    > eq1:=x+y=0;
    eq
    x
    y
    1 0
    :
    = + =
    > solve({eq,eq1},{x,y});
    {
    ,
    }, {
    ,
    }
    x
    y
    y
    x
    =
    =
    = −
    =
    0 0
    1 1
    Когда Maple не может найти решение, или решение не существует, то в результате выполне- ния команды solve()
    возвращается пустая последовательность со значением
    NULL
    , и в случае, если Maple не может найти решение (хотя оно существует), глобальная переменная
    _SolutionsMayBeLost устанавливается равной true
    В общем случае полиномиальное уравнение степени выше 4 может не иметь решения, выра- женного с помощью радикалов. В этом случае для представления результатов Maple исполь- зует специальную функцию
    RootOf(
    уравнение
    , переменная
    )
    , которая применяется для обозначения любого корня уравнения относительно заданной переменной:
    > eq:=x^4+x^3+1=0;
    eq
    x
    x
    :
    =
    +
    + =
    4 3
    1 0
    > solve(eq,x);
    RootOf (_
    _
    )
    Z
    Z
    4 3
    1
    +
    +
    > evalf(s);


    1 018912794 6025654200
    I

    41
    В этом примере функция
    RootOf (_
    _
    )
    Z
    Z
    4 3
    1
    +
    +
    представляет любое решение уравнения
    _
    _
    Z
    Z
    4 3
    1 0
    +
    + =
    . Обратим внимание на переменную _Z. Это системная переменная, сгене- рированная Maple для представления целых чисел. Подобные переменные используются
    Maple для представления всех решений тригонометрических уравнений. Кроме указанной переменной также используются переменная _NN для неотрицательных целых значений и _B для двоичных значений (0 или 1). Обратим внимание, что с помощью функции evalf()
    можно получить приближенные числовые значения функции
    RootOf
    Если решение уравнения выражается достаточно сложной формулой, то Maple может ввести специальные «промежуточные» переменные вида
    %n
    , где n
    является целым числом, для обо- значения каких-либо выражений и использовать эти переменные в окончательном представ- лении решения. Подобная ситуация иллюстрируется следующим примером:
    > solve(x^3+x+1=0,x);

    +
    +

    +
    +


    +








    1 6
    2 108 12 93 1
    12 1
    108 12 93 1
    2 3
    1 6
    2 108 12 93 1
    3 1
    3 1
    3
    %2
    (
    )
    ,
    %2
    (
    )
    %2
    (
    )
    ,
    I
    1 12 1
    108 12 93 1
    2 3
    1 6
    2 108 12 93 1
    3 1
    3
    %2
    (
    )
    %2
    (
    )

    +



    +








    I
    %1
    (
    )
    =
    +
    1 108 12 93 1
    3
    %2
    (
    )
    =
    +
    108 12 93 1
    3
    Здесь Maple вводит две переменные %1 и %2, причем первую в окончательном выражении решения кубического уравнения он не использует. Эти переменные можно в дальнейшем ис- пользовать как обычные переменные с присвоенными значениями как если бы пользователь задал их сам.
    Для получения всех решений тригонометрических уравнений следует задать значение гло- бальной переменной
    _EnvAllSolutions равным true
    . По умолчанию Maple решает три- гонометрическое уравнение на промежутке [
    , ]

    π π
    . Следующий пример иллюстрирует ис- пользование глобальной переменной
    _EnvAllSolutions
    > eq:=sin(x)^2+2*sin(x)+1=0;

    42
    eq
    x
    x
    : sin( )
    sin( )
    =
    +
    + =
    2 2
    1 0
    > s:=solve(eq,x);
    s:
    = −
    1 2
    π
    > _EnvAllSolutions:=true;
    _
    :
    EnvAllSolutions
    true
    =
    > s:=solve(eq,x);
    s
    Z
    :
    _


    = −
    +
    1 2
    2 1
    π
    π
    Как видно, в случае
    _EnvAllSolutions:=true
    Maple действительно выдает все решения тригонометрического уравнения с использованием целочисленной системной переменной
    _
    Z1, в которой знак тильда () означает, что на значения переменной наложены некоторые ограничения. В данном случае эта переменная может принимать только целочисленные зна- чения.
    При решении систем уравнений, когда ответ получается в виде множества уравнений, в ко- торых левая часть является неизвестной переменной, для того, чтобы присвоить найденные значения переменным, относительно которых решалась система, следует применять команду assign()
    . Эта команда присваивает переменным, стоящим в левой части уравнений из множества решений, значения, равные правым частям.
    > eq:=x*a+y*b=c;
    eq
    xa
    yb
    c
    :
    =
    +
    =
    > s:=solve({eq,x+y=1},{x,y});
    s
    y
    a
    c
    a
    b
    x
    c
    b
    a
    b
    : {
    ,
    }
    =
    = − +
    − +
    =

    − +
    > assign(s); x; y;
    c
    b
    a
    b

    − +
    − +
    − +
    a
    c
    a
    b

    43
    После того, как система решена и получено решение в виде множества равенств, значения искомых переменных не определены, поэтому применяется команда assign()
    для присва- ивания этим переменным полученных решений.
    Если решения получено в виде последовательности выражений, то получить значение соот- ветствующего решения можно с помощью индекса.
    > eq:=x^4+2*x^2+1=0;
    eq
    x
    x
    :
    =
    +
    + =
    4 2
    2 1
    0
    > s:=solve(eq);
    s
    I
    I I
    I
    :
    ,
    , ,
    = −

    > x1:=s[2]; x1;
    x
    I
    1:
    = −

    I
    Напомним, что в приведенном примере I означает комплексную мнимую единицу, равную

    1
    Команда
    fsolve()
    По умолчанию Maple пытается найти аналитическое выражение для корней уравнения. Если это ему не удается, то, как отмечалось выше, он просто ничего не печатает в области вывода.
    В подобных случаях (если корни действительно существуют) можно воспользоваться коман- дой fsolve()
    , которая находит численное решение уравнения или системы уравнений.
    Формат команды отличается от формата команды solve()
    наличием третьего параметра опция
    : fsolve(
    уравнения
    , переменные
    , опция
    ); где задание первых двух параметров соответствует заданию аналогичных параметров в ко- манде solve()
    , а параметр опция может принимать следующие значения:
    Значение
    Смысл
    complex разыскиваются комплекс- ные корни (только для по- линомов)
    fulldigits используется арифметика с максимальной мантис- сой

    44
    maxsols=n разыскивается n
    решений
    (только для полиномов) a..b или x=a..b задан промежуток [ , ]
    a b , на котором разыскивается решение (во второй форме задания этой опции x
    обо- значает имя неизвестной переменной в уравнении)
    По умолчанию для произвольного уравнения эта функция находит одно решение, но для по- линомов определяются все действительные корни. Чтобы найти все корни полинома, вклю- чая комплексные, следует задать опцию complex
    . Несколько примеров использования ко- манды численного решения уравнений показано ниже:
    > eq:=x^4+2*x^2-1=0;
    eq
    x
    x
    :
    =
    +

    4 2
    2 1
    > s:=fsolve(eq,x);
    s:
    , .
    = −
    6435942529 6435942529
    > s:=fsolve(eq,x,complex);
    s
    I
    I
    :
    ,
    , .
    , .
    = −

    6435942529 1 553773974 1 553773974 6435942529
    > fsolve(ln(sin(x))=0,x);
    1 570796327
    > fsolve(ln(sin(x))=0,x,x=2..infinity);
    7 853981634
    > fsolve(ln(sin(x))=0,x,x=8..infinity);
    14 13716694
    В этом примере также показано каким образом можно последовательно находить корни про- извольного уравнения, задавая интервал изменения неизвестной величины с учетом полу- ченного решения на предыдущем шаге нахождения корня (последние три команды).
    1   2   3   4   5   6


    написать администратору сайта