Уравнения с одной переменной
Для решения таких уравнений в Maple предусмотрены две команды: solve для символьного решения и fsolve для решения с ответом в численном виде. Например, формула для квадратного уравнения:
- restart;
- s1:=solve(a*x^2+b*x+c=0,x);
Синтаксис solve выглядит так: solve(equation,variable). Параметры записаны через запятую. Если задать численные коэффициенты, то система попытается дать численные ответы:
- s2:=solve(x^2-8*x+14=0,x);
Maple знает формулы для кубического уравнения:
- s3:=solve(a*x^3+b*x^2+c*x+d=0,x);
но они сложны, неприятны по внешнему виду, и их почти никогда не применяют.
Используем численные коэффициенты, чтобы ответ был численным:
- s4:=solve(x^3+3*x^2-2*x+7=0,x);
Этот результат – правильный, но поскольку Maple «думает» символами, то они не выглядят слишком пригодными. Для получения чисел с плавающей запятой следует применять уже известную команду evalf:
- evalf(s4);
или вводить коэффициенты уравнения с десятичной точкой:
- s4:=solve(x^3+3.*x^2-2.*x+7.=0,x);
Команда solve с полиномами работает по-умному: она знает фундаментальную теорему алгебры о том, что полином n-го порядка имеет n корней. Например, если спросить о корнях уравнения x6 + 1:
- s5:=evalf(solve(x^6+1=0,x));
в ответе должны быть все шесть.
Попробуем по-другому:
- s6:=solve(x^6+3*x^5+2=0,x);
RootOf часто встречается при решении уравнений в Maple. В этой задаче задается полином с целыми коэффициентами, что для Maple означает попытку решить уравнение в радикалах (квадратных, кубических корнях и т. п.). Это создает проблему, и в результате он не может дать в решение ничего иного, кроме корня –1. Но если нужны только числа, либо используйте evalf, либо изменяйте коэффициенты на числа с плавающей точкой, и вы получите все шесть корней:
- evalf(s6);
- solve(x^6+3.*x^5+2.=0,x);
Maple может решать более сложные уравнения вроде cos(x) – x/10:
- s7:=solve(cos(x)-x/10=0,x);
Снова RootOf, поэтому такой же подход к решению: чтобы получить хотя бы один корень, замените 10 на 10. или используйте evalf(s7)
- evalf(s7);
При решении сложных уравнений надо проявлять осторожность, поскольку возможно более одного ответа, и Maple не даст все. Попробуем нарисовать функцию cos(x) – x/10 и увидим, как много у нее нулей, т. е. столько корней придется искать.
- plot(cos(x)-x/10,x=-15..15);
Maple на самом деле не обманывает: 1.427551779 есть решение, но не все.
Важно: прежде чем искать решение, постройте график, тогда будете знать, сколько корней надо найти.
Как заставить Maple выдать все корни? Поскольку они ищутся численно, применяется команда fsolve, которой надо задать уравнение, переменную и диапазон значений для поиска корней. Например, на рисунке видно, что корни находятся вблизи –9.6, –9.2, –4, –2, 1.5, 5 и 7. Это надо указать в fsolve, задавая диапазон поиска решений (x1..x2):
- fsolve(cos(x)-x/10=0.,x,-10..-9.5);
- fsolve(cos(x)-x/10=0.,x,-9.5..-8.8);
Посмотрите, что произойдет, если указать диапазон, где нет корней:
- fsolve(cos(x)-x/10=0.,x,-8.5..-8);
По общему правилу, когда Maple без вычислений возвращает то, что ему задали, это означает, что либо он не может найти ответ, либо вы ошиблись. Ищите, где ошибка.
Учтите, что вместо диапазона можно просто задать одно угаданное решение:
- fsolve(cos(x)-x/10=0.,x=1.5);
Здесь надо быть осторожным. Если для fsolve подсказано начальное значение, причем оно расположено близко к максимуму функции, нули которой ищутся, то fsolve может ошибиться или может найти решение не в том месте, где начальная подсказка. Посмотрим на примере метода секущих, почему так происходит:
- fsolve(cos(x)-x/10=0.,x=0);
Еще один способ контроля за решениями – опция avoid в fsolve.
Ищем решения уравнения cos(x) + x/3. Чтобы узнать, где искать корни, нарисуем функцию и увидим рядом с 3 два близко расположенных корня. Команда найдет один из них:
- s1:=fsolve(cos(x)+x/3=0,x=3);
а вам нужен второй, и возникает проблема: как указать команде на него или как задать начальное значение. Можно так: ищи один корень вблизи 3, но не ищи s1:
- s2:=fsolve(cos(x)+x/3=0,x=.09,avoid={x=s1});
Найдите все действительные или комплексные корни следующих полиномов. Используйте для этого команды solve и fsolve.
| (a) x4 – 1, | (b) x3 + x2 + x + 1. |
solve дает комплексные величины, а fsolve – нет. Это можно исправить, указав fsolve, что нужно искать комплексные решения: fsolve(x^2+1=0, x,complex).
Посмотрите, что случается при использовании команды factor(f,complex), где f – полином, который надо разложить.
(a) Найдите все решения уравнения ex = 10sin(x) между –5 и 20.
(b) Найдите все решения уравнения e(–x) = x, используйте solve и fsolve и сравните ответы.
(с) Найдите все корни функции для x между 0 и 10.
(d) Найдите все корни производной функции Бесселя между 0 и 100 и занесите их в вектор-столбец an.
Эту задачу можно решить очень компактно с помощью команды seq с командой fsolve внутри нее.
Решение разбейте на части:
Шаг 1. Нарисуйте функцию между 0 и 100, затем несколько раз обновите диапазон графика, чтобы узнать, где первый и второй корни и как далеко они друг от друга (вы обнаружите, что они на расстоянии порядка π).
Шаг 2. Чтобы применить полученную информацию, используйте команду seq, чтобы генерировать все корни.
Команда seq, вроде такой: seq(n^2,n=0..20), генерирует список чисел; затем учтите, что первый аргумент seq, который генерирует зависящее от n число, может быть чем угодно, даже результатом fsolve.
Вот пример построения последовательности нулей косинуса с помощью seq и fsolve, который основан на догадке, что начинать надо с 1.4 и расстояние между нулями π: seq(fsolve(cos(x)=0,x=1.4+n*Pi),n=0..20);
Шаг 3. Все, что вам теперь нужно сделать, – загрузить эти числа в вектор-столбец. Если команда seq не дала первый корень при x=0, догадайтесь, как это сделать вручную.
