Вычисление интеграла

Форум пользователей пакета Maple

Модератор: Admin

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Вычисление интеграла

Сообщение henry » Вт ноя 22, 2011 4:55 pm

Всем привет!
Не могу никак понять, почему при digits = 10 интеграл берётся и все хорошо, но стоит поставить digits = 11, так сразу перестает считать. Буду очень рад узнать почему такое происходит, и было совсем прекрасно узнать, как решить эту проблему.

Код: Выделить всё

ex := exp(-v)*cos(x*v)*cos(v^2):
f :=x->evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)):
#plot(f(x), x=0..6):
#d := diff(ex, x):
g :=x -> Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8);


Заранее благодарю!

Kitonum
Сообщения: 2078
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Re: Вычисление интеграла

Сообщение Kitonum » Вт ноя 22, 2011 5:31 pm

henry писал(а):Всем привет!
Не могу никак понять, почему при digits = 10 интеграл берётся и все хорошо, но стоит поставить digits = 11, так сразу перестает считать. Буду очень рад узнать почему такое происходит, и было совсем прекрасно узнать, как решить эту проблему.

Код: Выделить всё

ex := exp(-v)*cos(x*v)*cos(v^2):
f :=x->evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)):
#plot(f(x), x=0..6):
#d := diff(ex, x):
g :=x -> Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8 );


Заранее благодарю!

Команда unapply более универсальный способ задания функции, чем стрелкой:

g :=unapply(Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity),x):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8 );

max_x := 0.71513236570

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Вт ноя 22, 2011 5:43 pm

Благодарю за помощь, но у меня даже после этого не хочет выдавать нужный результат.

Код: Выделить всё

ex := exp(-v)*cos(x*v)*cos(v^2):
f :=unapply(evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)),x):
#plot(f(x), x=0..6):
#d := diff(ex, x):
g := unapply(Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity),x):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8);

Kitonum
Сообщения: 2078
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Вт ноя 22, 2011 5:53 pm

henry писал(а):Благодарю за помощь, но у меня даже после этого не хочет выдавать нужный результат.

Чем объяснить - не знаю! Мой Maple 13 (классика) считал примерно 1.5 минуты.

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Вт ноя 22, 2011 7:27 pm

не знаю почему так, но видать конфигурация ноута моего не позволяет, хотя для 10 считает полминутки.
Проверил на другом и правда все ок.
Спасибо за помощь!

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Чт ноя 24, 2011 1:01 pm

Не могли бы вы помочь разораться ещё с одним вопросом по этому примеру.

ex := exp(-v)*cos(x*v)*cos(v^2):
f := unapply(evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)),x):
#plot(f(x), x=0..6);
#d := diff(ex, x):
g := unapply(Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity),x):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8 );
f(max_x);


До сюда все хорошо, и получаю правильный ответ, с указанной точностью, по аналогии ищу следующее:

min_x := fsolve(g(x), x=3.9..4.1);
f(min_x);


Но здесь min_x получаю на один знак меньше, а f(min_x) аж на один знак больше. Почему такой результат?
Заранее спасибо Вам!

Kitonum
Сообщения: 2078
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Чт ноя 24, 2011 3:09 pm

henry писал(а):Не могли бы вы помочь разораться ещё с одним вопросом по этому примеру.

ex := exp(-v)*cos(x*v)*cos(v^2):
f := unapply(evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)),x):
#plot(f(x), x=0..6);
#d := diff(ex, x):
g := unapply(Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity),x):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8 );
f(max_x);


До сюда все хорошо, и получаю правильный ответ, с указанной точностью, по аналогии ищу следующее:

min_x := fsolve(g(x), x=3.9..4.1);
f(min_x);


Но здесь min_x получаю на один знак меньше, а f(min_x) аж на один знак больше. Почему такой результат?
Заранее спасибо Вам!


Значащие цифры - все цифры числа, начиная с 1-й слева, отличной от нуля, до последней цифры. Посчитайте!

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Ср ноя 30, 2011 2:52 pm

я все-таки так и не могу понять почему происходит следующее:

ex := exp(-v)*cos(x*v)*cos(v^2):
f := x->evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)):
#plot(f(x), x=0..6);
d := diff(ex, x):
g :=x -> Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity):
Digits := 11:
max_x := fsolve(g(x), x=0.6..0.8 );
max_x:=0.71513236570

Digits:=11;
f(max_x);

0.53728642005
То что мне надо, 11 знаков после запятой.
Продолжаю вычисления:
Digits:=11;
min_x := fsolve(g(x), x=3.9..4.1);
f(min_x);

но в этот раз получаю несколько другие результаты:
min_x := 4.00682992?4
-0.066062143200;

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Чт дек 01, 2011 6:50 pm

henry писал(а):я все-таки так и не могу понять почему происходит следующее:

ex := exp(-v)*cos(x*v)*cos(v^2):
f := x->evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)):
#plot(f(x), x=0..6);
d := diff(ex, x):
g :=x -> Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity):
Digits := 11:
max_x := fsolve(g(x), x=0.6..0.8 );
max_x:=0.71513236570

Digits:=11;
f(max_x);

0.53728642005
То что мне надо, 11 знаков после запятой.
Продолжаю вычисления:
Digits:=11;
min_x := fsolve(g(x), x=3.9..4.1);
f(min_x);

но в этот раз получаю несколько другие результаты:
min_x := 4.00682992?4
-0.066062143200;


min_x := 4.00682992?4
-0.066062143200;

т.е. видно, что знаков в min_x на один меньше (10), а f(min_x) - аж на один больше

Kitonum
Сообщения: 2078
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Чт дек 01, 2011 8:20 pm

henry писал(а):... видно, что знаков в min_x на один меньше (10), а f(min_x) - аж на один больше


Кажется, Вы так и не разобрались, что называется числом значащих цифр!

Digits:=11;
min_x := fsolve(g(x), x=3.9..4.1);
f(min_x);

Digits := 11
min_x := 4.0068299164
-0.066062143200

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Чт дек 01, 2011 9:06 pm

Да, тупанул я. Правда мои проблемы со знанием теории, никак не влияют на ответ.
Мне необходимо получить ещё один знак в этом ответе: 4.0068299164. Попробовал на единицу увеличить Digits, но даже на довольно неслабой машине, я ждал порядка 20-25 минут, и безрезультатно. Очень бы хотелось узнать как ускорить работу.
Читал где-то, что можно запретить системе какие-либо ненужные для меня действия, отсутствие которых на мой ответ не повлияют, а скорость увеличат. Самостоятельно найти не могу подобного, может вы подскажите?

Kitonum
Сообщения: 2078
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Пт дек 02, 2011 11:19 am

henry писал(а):...Мне необходимо получить ещё один знак в этом ответе: 4.0068299164. Попробовал на единицу увеличить Digits, но даже на довольно неслабой машине, я ждал порядка 20-25 минут, и безрезультатно. Очень бы хотелось узнать как ускорить работу...

Другой подход к решению Вашей задачи с помощью пакета Optimization . Пакет считает с 18 знаками, поэтому при вычислении несобственного интеграла я задал 20 знаков.

ex := exp(-v)*cos(x*v)*cos(v^2):
f := x->evalf[20](Int(ex,v=0..infinity)):
min_x := Optimization[Minimize](f, 3.9..4.1);


min_x := [-0.0660621432000596948, [4.00682990572763487]]

Попробуйте для сравнения ещё посчитать свой пример, используя весьма мощный пакет Сергея Моисеева DirectSearch, который можно свободно скачать с сайта maplesoft.com по ссылке http://www.maplesoft.com/applications/view.aspx?SID=101333

henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Пт дек 02, 2011 5:03 pm

Воспользовавшись вашими рекомендациями вот что я у меня получилось при решении этой задачи:
f := x->evalf(Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)):
Вариант 1. Обычными средствами Maple:
g := x->Int(-exp(-v)*sin(x*v)*v*cos(v^2), v=0..infinity):
Digits := 11:
max_x := fsolve(g(x), x=0.2..0.8 );
f(max_x);

max_x := 0.71513236570
0.53728642005
min_x := fsolve(g(x), x=3.9..4.1);
f(min_x);

min_x := 4.00682991642
-0.06606214320
Этот то, что мне нужно, но к сожалению таким способом не на моей машине (результат переписан с ответов предложенных к этому заданию)

Вариант 2. с помощью пакета Optimization:
f := x->evalf[12](Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity)):
max_x := Optimization[Maximize](f,0.2..0.8 );
min_x := Optimization[Minimize](f,3.9..4.1);

max_x := [0.537286420055000, [0.715133481057751]]// отличие от 1-го варианта уже на 6 знаке
min_x := [-0.0660621432001000, [4.00682990709403]]// тут на 8 знаке


Вариант 3. с помощью пакета DirectSearch:
with(DirectSearch):
f:=Int(exp(-v)*cos(x*v)*cos(v^2),v=0..infinity):
constr1:=[x=3.9..4.1]:
constr2:=[x=0.2..0.8]:
min_x:=Search(f,constr1);
max_x:=Search(f,constr2,maximize);

max_x := [0.537286420054778, [x = 0.715132461390217], 20]//отличие от 1-го варианта на 7 знаке
min_x := [-.660621432000595e-1, [x = 4.00682992531211], 14]//тут все так же на 8 знаке

При одинаковых промежутках получаю отличающиеся друг от друга результаты, причем которые, если верить предложенным ответам на задание, неверны. Почему так получается? И что же надо сделать что бы получить ответ из первого пункта?

hirnyk
Сообщения: 438
Зарегистрирован: Пт апр 08, 2005 1:41 pm

Сообщение hirnyk » Пт дек 02, 2011 11:27 pm

restart; st := time(): Digits := 22; with(DirectSearch):
f := x-> evalf(Int(exp(-v)*cos(x*v)*cos(v^2), v = 0 .. infinity)) :
constr1 := [x = 3.9 .. 4.1]:
constr2 := [x = .2 .. .8]:
min_x := Search(f, constr1, initialpoint = [x = 4.0], tolerances = [10^(-15), 10^(-15)]);
max_x := Search(f, constr2, initialpoint = [x = .5], tolerances = [10^(-15), 10^(-15)], maximize); time()-st

22
[-0.06606214320005970879453,[4.006829916418939447162] , 27]
[0.5372864200547764491773,[0.7151323657067472892610] , 35]
2155.343







henry
Сообщения: 33
Зарегистрирован: Чт апр 15, 2010 5:40 pm

Сообщение henry » Сб дек 03, 2011 4:41 pm

Вроде бы не такой уж и слабый ноут у меня (Dual-Core 2.1ГГц, 2гб ОЗУ), но при такой точности не дает мне правильно ответа, работает при Digits до 15, а там как я уже пробовал немного не те ответы. Не пониманию почему такая работоспособность у моей машины, попробую поискать у знакомых :) Спасибо Вам за уточнение hirnyk