Чтение онлайн

ЖАНРЫ

Maple 9.5/10 в математике, физике и образовании

Дьяконов Владимир Павлович

Шрифт:

Для получения итерационной формулы в аналитическом виде здесь используется функция unapply. Теперь, если задать решаемое уравнение, то можно получить искомое аналитическое выражение:

> expr:=sin(х)^2-0.5;

expr := sin(x)² - .5

> F:=NI(expr,x);

Далее, задав начальное приближение для х в виде х=х0, можно получить результаты вычислений для ряда итераций:

> х0:=0.2;

х0:= .2

> to 8 do
х0:=F(х0);od;

х0:= 1.382611210
х0:= .117460944
х0:= 2.206529505
х0:= 2.360830634
х0:= 2.356194357
х0:= 2.356194490
х0:= 2.356194490
х0:= 2.356194490

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

Можно попробовать с помощью полученной процедуры получить решение и для другой функции:

> expr:=ln(х^2)-0.5;

expr: = ln(x² ) - .5

> F:=NI(expr, х);

F:=x→x-½(ln(x²) - .5)х

>> х0:=0.2;

х0:= 2

> to 8 do x0:=F(x0);od;

x0:= .55718875825
x0:= 1.034437603
x0:= 1.258023119
x0:= 1.283760340
x0:= 1.284025389
x0:= 1.284025417
x0:= 1.284025416
x0:= 1.284025417

Здесь итерационная формула имеет (и вполне естественно) уже другой вид, но сходимость к корню также обеспечивается за несколько итерации.

Возможна и иная форма задания итерационной процедуры с применением оператора дифференцирования D и заданием исходной функции также в виде процедуры (файл р9):

> MI:=proc(f::procedure)

> (х->х)-eval(f)/D(eval(f));

> end;

MI := proc(f::procedure) (x→x) -eval(f)/D(eval(f)) end proc

> g:=x->x-cos(x);

g := x→x - cos(x)

> SI:=MI(g);

> x0:=0.1;

x0:=.1

> to 6 do x0:=SI(x0) od;

x0:= .9137633858
x0:= .7446642419
x0:= .7390919660
x0:= .7390851333
x0:= .7390851332
x0:= .7390851332

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

10.6.2. Вычисление интеграла по известной формуле

Рассмотрим следующий пример (файл

р9):

> Int(e^x*x^n,x)=int(e^x*x^n,x);

∫exxndх = -(-1)(-n)ln(e)(-1-n)n(-1)nln(е)nnГ(n)(-х ln(е))(-n) – хn(-1)n ln(е)n е(хln(e))– хn(-1)nln(е)nn(-х ln(е))(-n)Г(n, -x ln(е)))

Ранние версии системы Maple не брали этот интеграл, поскольку он не имеет аналитического представления через обычные функции. Maple блестяще вычисляет этот «крепкий орешек», но полученное выражение довольно сложно.

Из математики известно, что такой интеграл может быть представлен в следующем виде:

Используя эту формулу, мы можем создать простую процедуру для численного и аналитического вычисления данного интеграла.

> IntExpMonomial:=proc(n::anything,х::name)

local i;

n!*exp(x)*sum(((-1)^(n-i)*х^i)/i!,i=0..n);

end;

 IntExpMonomial := proc(n::anything, x::name)

 local i;

n! × exp(x) × sum((-1)^(n-i) × x^i/i!,i=-..n)

 end proc

Проверим ее в работе:

> IntExpMonomial(3,х);

> IntExpMonomial(5,x);

> IntExpMonomial(n, x);

Результат в аналитическом виде довольно прост для данного интеграла с конкретным значением n. Более того, мы получили несколько иной результат и для n в общем случае. Но точен ли он? Для ответа на этот вопрос продифференцируем полученное выражение:

> diff(%,х);

Результат дифференцирования выглядит куда сложнее, чем вычисленный интеграл. Однако с помощью функции simplify в Maple 9 он упрощается к подынтегральной функции:

> simplify(%);

еx хn

Maple 9.5 выдал более замысловатое выражение:

(-1)n еx (-x)n

Это говорит о том, что задача вычисления заданного интеграла в аналитической форме действительно решена. А что касается громоздкости результатов, так ведь системы, подобные Maple, для того и созданы, чтобы облегчить нам работу с громоздкими вычислениями — в том числе аналитическими.

Поделиться с друзьями: