Форум программистов, компьютерный форум CyberForum.ru

Дано действительное а Найти такое наименьшее n, что - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Bob2
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 5
01.08.2012, 07:37     Дано действительное а Найти такое наименьшее n, что #1
1+ 1/2+...1/n a
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 07:37     Дано действительное а Найти такое наименьшее n, что
Посмотрите здесь:

C++ Дано натуральное число m. Найти такое натуральное n, что двоичная запись n получается из двоичной записи m изменением порядка цифр на обратный (
Для данного натурального числа n определите такое наименьшее целое k, что... C++
C++ Для заданного x найти наименьшее k такое, что m(k) ≤ x ≤ m(k+1)
C++ посмотрите код, в чем не правильно! (определить наименьшее неотрицательное целое k такое, что b < 2k)
C++ Дано действительное E>0. Найти первый член y[n], для которого выполнено y[n]-y[n-1]<E
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
01.08.2012, 10:21     Дано действительное а Найти такое наименьшее n, что #2
Вероятно, имеется в виду (1+1/2+1/3+...+1/n) > a ? Хорошая задача...
Я бы сказал - очень хорошая задача! Такое n существует, т.к. ряд Ʃ(1/n) расходится. Но найти его тупым перебором будет сложно: если просто суммировать с единицы и ждать, пока сумма превысит a, то можно и не дождаться, т.к. погрешность округления все съест. Суммировать нужно "с другого конца", но он-то и неизвестен.
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 10:35     Дано действительное а Найти такое наименьшее n, что #3
Цитата Сообщение от Bob2 Посмотреть сообщение
Дано действительное а Найти такое наименьшее n, что
1+ 1/2+...1/n a
- ИМХО архитривиальная задача
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
    int a = 0;
    int n = 0;
    double sum  = 0;//Áóäåò ñîäåðæГ*ГІГј Г·Г*Г±ГІГЁГ·Г*ГіГѕ ñóììó ðÿäГ*
    cout<<"a = ";cin>>a;
    for(n = 1; sum < a; n++)
    {
        system("cls");
        //ÑäåëГ*Г« ГЁГ*äèêГ*öèþ Г°Г*áîòû ÷òîáû Г*ГҐ Г§Г*Г±Г*ГіГІГј
        cout<<"a = "<<a<<endl;
        cout<<"n = "<<n<<" sum = "<<sum<<endl;
        sum = sum + 1.0/n;
    }
    system("pause");
    return 0;
}
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
01.08.2012, 10:37     Дано действительное а Найти такое наименьшее n, что #4
Нет, Юра... Возьми, например, a=10000 и найди n.
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 10:51     Дано действительное а Найти такое наименьшее n, что #5
Цитата Сообщение от Catstail Посмотреть сообщение
Нет, Юра... Возьми, например, a=10000 и найди n.
- Таки Да, просто число для 10000 будет сильно большим, возможно точности дабла не хватит, можно 1000-чу или лучше 100, для этого варианта сейчас выложу код.

Добавлено через 4 минуты
Catstail, вот тебе код, если есть куча времени скажешь при каком n сумма была немногим меньше 10000
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    int a = 0;
    double n = 0;
    double sum  = 0;//Áóäåò ñîäåðæГ*ГІГј Г·Г*Г±ГІГЁГ·Г*ГіГѕ ñóììó ðÿäГ*
    cout<<"a = ";cin>>a;
    for(n = 1; sum < a; n = n + 1)
    {
        system("cls");
        //ÑäåëГ*Г« ГЁГ*äèêГ*öèþ Г°Г*áîòû ÷òîáû Г*ГҐ Г§Г*Г±Г*ГіГІГј
        cout<<"a = "<<a<<endl;
        cout<<"n = "<<n<<" sum = "<<sum<<endl;
        sum = sum + 1.0/n;
    }
    system("pause");
    return 0;
}
- он всё посчитает, когда сам дождусь отработки для 100-ни приложу аттачам скриншот

Добавлено через 1 минуту

Не по теме:

Пока у меня хватило времени дождаться 9500 итераций и суммы 9,73 но сумма растёт, так что наивно полагать что не посчитаем

Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
01.08.2012, 12:33     Дано действительное а Найти такое наименьшее n, что #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
но сумма растёт, так что наивно полагать что не посчитаем
- увы, это не совсем так. Посчитаем, но ЧТО? Попробуйте посчитать синус из его разложения в ряд (типовой алгоритм - с заданной точностью) для аргумента x, равного, скажем 10000. Ряд "сойдется", но синус будет больше единицы...
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 13:16     Дано действительное а Найти такое наименьшее n, что #7
Catstail, мы считаем бесконечную сумму, ряд 1/n расходиться а следовательно предел его суммы равен бесконечности, таким образом для какого нибудь 150 тысячного n накомпленная сумма превзойдёт 100, а для 3млн 2-го превзойдёт 1000-чу. Я чётко и ясно написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Catstail, вот тебе код, если есть куча времени скажешь при каком n сумма была немногим меньше 10000- он всё посчитает
- почему даже не удосужился слинковать и запустить?!За те 3 часа которые прошли между нашим обзением программа спокойно бы досчитала и до 10000 тыс, но как я вижу тут уже играет свою роль простая лень

Добавлено через 6 минут
для аргумента x, равного, скажем 10000. Ряд "сойдется", но синус будет больше единицы...
- во первых все разложения в ряд Тейлора валидны для |x| < 1 во вторых sin(1000) = sin(1000%2pi) = sin(1000-159*2*pi) ~ sin(0.009)
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 13:21     Дано действительное а Найти такое наименьшее n, что #8
Терпения у меня хватило для 10-ки, но алгоритм отпашет до самого MAX_DOUBLE потом конечно крах, если при этом n а оно составит порядка 1E308 мы не наберём 10000 это не значит что этого числа достичь в принципе не возможно - делаем long double помощней CPU и вперёд. Для ускорения работы предлагаю всем
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
system("cls");
сделать комент вот этого
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
-=ЮрА=-
01.08.2012, 14:03
  #9

Не по теме:

Catstail, вот ссылка на более быстрый в плане работы код
http://liveworkspace.org/code/9f50e9...b44e2515c6c852

n = 2.97e+08 sum = 20.0865
- сидеть ещё E+10-15 знаков у меня просто нет времени...

Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
01.08.2012, 15:29     Дано действительное а Найти такое наименьшее n, что #10
Юра, ты прав!!! Это я ступил. В этой задаче нет накопления ошибки, поскольку отсутствует вычитание близких чисел (в отличие от ряда для синуса). Поэтому вычисления - действительно только вопрос времени, а задача достаточно тривиальна.

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
во первых все разложения в ряд Тейлора валидны для |x| < 1
- нет, ряд сходятся для любого x (факториал в знаменателе уверенно давит степень). Для точности double можно убедиться, что приличная точность получается для x до сотни. Но все это не имеет отношения к Теме. Твое решение верно.
-=ЮрА=-
01.08.2012, 15:37
  #11

Не по теме:

Catstail, для синуса аргумент должен быть по модулю менее единицы и так почти для всех разложений http://ru.wikipedia.org/wiki/Ряд_Тейлора везде |x| < 1
Для x с модулем больших единицы ряды будут расходиться

Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
01.08.2012, 18:24     Дано действительное а Найти такое наименьшее n, что #12
Не могу согласиться. Дело в другом. Вот натурный эксперимент:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "iostream.h"
#include "math.h"
 
double cos_(double x, double eps)
{
   double s,n,a;
   a=1;
   s=1;
   n=0;
   while (1)
   {
    if (fabs(a) <= eps) break;
    a=-a*x*x/((2*n+1)*(2*n+2));
    s=s+a;
    n++;
   }
   return s;
}
 
int main(int argc, char* argv[])
{
   double x;
   for (x=0; x < 50; x+=1)
    //cout << x << endl << cos(x) << endl << cos_(x,1.0E-13) << endl << endl;
    cout << "x=" << x << " Diff=" << fabs(cos(x)-cos_(x,1.0E-14)) << endl;
   return 0;
}
Здесь считается косинус (разложением в ряд). Суммирование идет до тех пор, пока очередной член ряда не станет меньше заданного eps. Потом в цикле исследуется разность между стандартным косинусом и нашим. И что же? Примерно до значений аргумента 25 все просто прекрасно. Потом погрешность становится заметной, а потом и вовсе неприемлемой. В чем дело? Если бы ряд расходился при x > 1, как удается дойти до 25?
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2012, 14:13     Дано действительное а Найти такое наименьшее n, что #13
Catstail, разница в 13339, для х = 49 не настороживает?Меня вот сильно, притом погрешность для х больших единицы растёт в геометрической прогрессии, интересно а какая разница будет между cos(100) - cos_(100,1.0E-14) - это как раз то о чём я говорил. Кстати есть такая штука, как зависимость точности разложения от модуля переменной, так вот чем больше модуль тем хуже разложение описывает истинное значение функции - вот как раз значения за 50 яркий тому пример.
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2012, 15:21     Дано действительное а Найти такое наименьшее n, что #14
Catstail, ниже продолжение твоей таблицы и ты будешь говорить что для значений больших 1 ряд cos(x) сходиться???!Да нам повезло до х = 25-30 отклонение ещё не очень велико, а потом...?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double Taylor(double x, double eps)
{
    double sum = 0;
    double an  = 1;
    double n   = 0;
    while(eps < fabs(an))
    {
        sum = sum + an;
        an *= (-1)*x*x/((2*n + 1)*(2*n + 2));
        n   = n + 1;
    }
    return sum;
}
 
int main()
{
    double x;
    cout<<"x\tcos(x)\tTaylor\n";
    for(x = 50; x < 100; x += 1)
        cout<<x<<"\t"
            <<setw(6)<<setprecision(3)<<cos(x)<<"\t"
            <<setw(6)<<setprecision(3)<<Taylor(x,1E-6)<<endl;
    return 0;
}
http://codepad.org/VmyRCt5l
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.08.2012, 15:50     Дано действительное а Найти такое наименьшее n, что #15
Естественно, это неизбежно, если представлять косинус как частичную сумму разложения в ряд Тейлора (точнее, ряд Маклорена). Именно поэтому внутри компьютера по разложению Тейлора вычисляется значение в пределах, например (–π/8, π/8), а для больших значений угла значение функции получается с помощью тождественных преобразований (периоды, половинные аргументы и т. п.).
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
02.08.2012, 17:22     Дано действительное а Найти такое наименьшее n, что #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
для значений больших 1 ряд cos(x) сходиться???!Д
- сходится... Сходится, Юра. Признак Даламбера утверждает, что если существует предел an+1/an, и он меньше единицы, то ряд сходится. Для косинуса это отношение равно (-1)*x2/((2n+1)*(2n+2)). Легко убедиться, что предел этого отношения при n->беск. равен нулю. Ряд сходится. Сходится абсолютно при любых вещественных x.

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Catstail, разница в 13339, для х = 49 не настороживает?Меня вот сильно, притом погрешность для х больших единицы растёт в геометрической прогрессии, интересно а какая разница будет между cos(100) - cos_(100,1.0E-14) - это как раз то о чём я говорил.
- нет причина вовсе не в расходимости ряда, а в природе чисел с плавающей точкой (это не вещественные числа в математике).

Добавлено через 4 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Именно поэтому внутри компьютера по разложению Тейлора вычисляется значение в пределах, например (–π/8, π/8), а для больших значений угла значение функции получается с помощью тождественных преобразований (периоды, половинные аргументы и т. п.).
- это хорошо, что sin и cos - периодические функции... А если бы нет? Кстати, "внутри компьютера" sin и cos вычисляются не разложением в ряд, а с использованием эффективного аппроксимирующего полинома (даже, говорят, не очень высокой степени).
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2012, 17:38     Дано действительное а Найти такое наименьшее n, что #17
нет причина вовсе не в расходимости ряда, а в природе чисел с плавающей точкой (это не вещественные числа в математике).
- прошу пояснить этот момент, в своём последнем кодя я специальтно целочисленное Н заменил на вещественное, дабы избежать ситуации когда Н превосходит INT_MAX (а малоли сколько там членов набегает пока точность 1E-6 или даже как здесь
Цитата Сообщение от Catstail Посмотреть сообщение
1.0E-14
в -14-ой станет). Уверенное расхождение косинусов свидетельствует о неверной сумме в разложении, а стало быть неприменимости разложения для чисел с |x| > 1

Добавлено через 1 минуту

Не по теме:

. Легко убедиться, что предел этого отношения при n->беск. равен нулю.
ну нне могу сейчас я найти ту лекцию где к этому шла ещё приписочка для ряда cos (|x| < 1) но это не значит что х должен быть более 1

OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.08.2012, 18:23     Дано действительное а Найти такое наименьшее n, что #18
Тут дело не в округлении чисел с плавающей точкой (хотя и это тоже).

И не в сходимости ряда. С ним всё окей: ряд, составленный из частичных сумм ряда Тейлора, сходится: то есть для любой заданной ошибки ε мы можем указать такое число N, что N членов хватит, чтобы частичная сумма ряда не отличалась от значения cos x более чем на ε. Но. Вчитываемся: ряда составленного из частичных сумм ряда. N зависит и от ε, и от x, и от a (опорной точки ряда Тейлора). Естественно, для одних x при заданных ε и a требуется 10 слагаемых, для больших x не хватает и 50.

А вообще да, используются другие полиномы, например, полиномы Чебышева. Есть чудная книжка «Вычисление функций на ЭВМ» Б. Попова и Г. Теслера, где рассматривается куча способов вычисления различных функций. И тригонометрических в том числе.
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
02.08.2012, 20:46     Дано действительное а Найти такое наименьшее n, что #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну не могу сейчас я найти ту лекцию
- Но ведь признак Даламбера имеет место. А вопросы накопления погрешности при вычислениях с плавающей точкой хорошо рассмотрены в книге Д. МакКракен, У. Дорн "Программирование на Фортране". Пример с синусом и косинусом именно оттуда (стр. 95)
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 21:34     Дано действительное а Найти такое наименьшее n, что
Еще ссылки по теме:

C++ Дано вещественное число a. Найти такое наименьшее n, что 1+1/2+1/3+.+1/n>a
C++ Дано положительное число А > 10. Найти такое k, что (k-1)! <= A < k
Найти наименьшее значение m такое что 2m>n с использованием циклов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2012, 21:34     Дано действительное а Найти такое наименьшее n, что #20
Catstail, я поэтому и писал за малость аргумента, даже далеко ходить не буду ваш скрин приведу
в любом случае лучше использовать разложение при этом учитывасть периодичность тригонометрических функций скажем тот же тангенс для PI/2 мы не сможем разложить...
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
Yandex
Объявления
02.08.2012, 21:34     Дано действительное а Найти такое наименьшее n, что
Ответ Создать тему
Опции темы

Текущее время: 22:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru