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

Расходящиеся ряды или как правильно задать проверку - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ структура данных http://www.cyberforum.ru/cpp-beginners/thread63519.html
помогите с решением (в структуре данных ):имеем в текстовом файле список студентов: фамилия ,имя шифр группы, название экзамена и оценки .сформировать лучших студентов ,у которых средние оценки даны в интервале . Список спорядковать по группе и фамилии: фамилия ,имя ,шифр группы, средний бал. Вывести две таблицы: данные и полученный результат.
C++ Размещение элементов массива по спирали Как разместить элементы массива (nxn) по спирали (начиная с нижнего левого угла против часовой стрелки)? Помогите пожалуйста!!(( http://www.cyberforum.ru/cpp-beginners/thread63488.html
C++ Функция strchr (Язык Си) -не выполняет=(
Не могу понять почему не работает, обьясните, пожалуйста, как исправить!! вот такое работает (это пример из компилятора): char *ptr, s='r'; ptr = strchr(s2, s); if (ptr) printf("The character %s is at position: %d\n", s, ptr-s2+1); else
ГРАФЫ C++
в Университете задали .Составить программу.(Графф) 1)Последовательность и количество вершин графа ,задает пользователь. 2)Если текущая вершина,без остатка делится на вышестоящую то располагается она слева , в противном случае справа . Обход вершин начинается сверху. Самая первая вершина делится на 1. Я по графам не силен , Помогите пожалуйста .
C++ запись в файл и чтение из файла http://www.cyberforum.ru/cpp-beginners/thread63440.html
Здравствуйте!!! Как правильно сделать в с++ запись в файл и чтение из файла?? Объясните пожалуйста с примерами??
C++ После компиляции выдает ошибку После компиляции выдает такое сообщение: ------ Build started: Project: dz2, Configuration: Debug Win32 ------ Compiling... Skipping... (no relevant changes detected) c.cpp Build log was saved at "file://d:\laba\dz2\dz2\Debug\BuildLog.htm" dz2 - 0 error(s), 0 warning(s) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== подробнее

Показать сообщение отдельно
brute
0 / 0 / 0
Регистрация: 13.11.2009
Сообщений: 13
13.11.2009, 15:31     Расходящиеся ряды или как правильно задать проверку
Здравствуйте,
наткнулся на проблему, которая не дает покоя мозгу.
Ситуация следующая:
Работаю в среде MS Visual Studio 2005(C++), написал программу вычисления функции методом рядов Тейлора. Функция разложения : f=ln(1-x), Раскладывается она следующим образом:
http://i36.tinypic.com/20fysfp.gif
При входе в цикл первое значение вычисляется после 10,000,000 операций (если E задать 1e-7),
если же задать E = 1e-8, то первое значение вычисляется уже после 100,000,000 операций (это видно в выводе)
Причем если задать дополнительную проверку на максимальное кол-во итераций (допустим 1000), то точность теряется где-то уже после 3-4 знака..
Вообще говоря, происходит какое-то непонятное переполнение, после которого точность сильно повышается, а кол-во итераций снижается на несколько порядков!
Как и с чем это может быть связано и возможен ли другой способ проверки значения во втором цикле for?(может быть, y2-y1 < E? Как это можно реализовать?)
По-идее, функция(ряд Тейлора) расходится при больших n... Вот здесь то и вопрос: Как быть в таком случае?


Код программы (C++):
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "iostream"
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <math.h> 
 
//using CharToOemA func to convert ANSI to OEM
char bufRus[256];
char* Rus(const char* text)
    {
        CharToOemA(LPCSTR(text), bufRus);
        return bufRus;
    }
 
char* Rus(const char* text);
 
int _tmain(int argc, _TCHAR* argv[])
{
    double dXbegin, dXend, dXstep, N, E;//, N1=1, i=1.0;
    printf(Rus("Программа вычисления функции ln(1-x), заданной рядами Тейлора\n"));
    printf(Rus("и вывода в столбец значений ф-ии на интервале [x1;x2]\n"));
    printf(Rus("x лежит в диапазоне (-1 <= x < 1)\n"));
    printf(Rus("с шагом dx и заданной точностью E.\n"));
    printf(Rus("Введите начало интервала, конец интервала, число шагов(N), точность вычислений.\n"));
    printf("x1, x2, N, E = ?\n");
    scanf("%lf%lf%lf%lf", &dXbegin, &dXend, &N, &E);
    
    if (    dXbegin < -1e300    // Проверка на диапазон значений вводимых чисел
        ||  dXbegin > 1e300
        ||  dXend < -1e300
        ||  dXend > 1e300
        ||  N < 1
        ||  N > 1e300
        ||  E < 0
        ||  E > 1e300)
    {
        printf(Rus("Вне диапазона\n"));
        getch();
        return 0;
    }
    if ( dXbegin > dXend )
    {
        printf(Rus("Начало интервала больше чем его конец, корректирую...\n"));
        dXbegin = -dXbegin;
        dXend = -dXend;
    }
    dXstep=(dXend-dXbegin)/N;
//  N=1.0; // экономим место в памяти(вместо объявления новой переменной), используем ненужную далее переменную N
    
    for (double x=dXbegin, i, y; x <= dXend; x+=dXstep)
    {
        if ( x < -1 || x >= 1)
        {
            printf(Rus("Значение функции в точке x=(%lf) не существует\n"), x);
            continue;
        }
    
    for (i=1, y=0, N=1; E < fabs(N/i); i++)
        {
            N*=x;   //следующий член ряда
            y-=(N/i);   //сумма
        }
    printf("i=%lf\n", i);
    printf(Rus("В точке x=[%.10lf]\ty=[%.10lf]\n"), x, y);
    }
    printf("E=[%lf]\nN=[%lf]\ndXbegin=[%lf]\ndXend=[%lf]\n", E, N, dXbegin, dXend);
    getch();
    return 0;
}
Вывод:
Программа вычисления функции ln(1-x), заданной рядами Тейлора
и вывода в столбец значений ф-ии на интервале [x1;x2]
x лежит в диапазоне (-1 <= x < 1)
с шагом dx и заданной точностью E.
Введите начало интервала, конец интервала, число шагов(N), точность вычислений.
x1, x2, N, E = ?
-1 -0.9 2 1e-8
i=100000000.000000
В точке x=[-1.0000000000] y=[0.6931471856]
i=253.000000
В точке x=[-0.9500000000] y=[0.6678293679]
E=[0.000000]
N=[0.000002]
dXbegin=[-1.000000]
dXend=[-0.900000]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru