Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Рекуррентное соотношение


Автор: serega339344 13.5.2017, 00:42
Есть задача:
Для динамического одномерного массива X из N (0<N≤20) элементов
составить алгоритм и программу (консольное приложение на Си)
нахождения суммы ряда с заданной точностью E (0<E<0.1) для
каждого из элементов X. Использовать рекуррентные
соотношения при вычислении очередного члена ряда.

Возникли проблемы при вычислении рекуррентной формулы( конкретно при делении i члена ряда на i-1). Саму программу уже написал. Прощу помощи.

Ряд:
http://www.picshare.ru/view/8084988/

Автор: feodorv 13.5.2017, 03:16
Код

double v = x, sum = x;
for( i = 2; i < 50; ++i)
{
  v = v * (- (4 * i - 5) * x / (double) (4 * i)); // рекуррентное соотношение
  sum += v;
}

ЗЫ Мог где-нибудь и ошибиться, не проверял...

Автор: serega339344 13.5.2017, 10:00
Мне бы просто сам вывод рекуррентной формулы, программа у меня есть

Код

#include "stdafx.h"
#include <stdio.h> // printf, scanf
#include <conio.h> // getch
#include <math.h> // fabs, pow, ceil\floor, log, log10, exp, sqrt
#include <stdlib.h> // randomize, rand
#include <windows.h> // SetConsoleOutputCP(1251); SetConsoleCP(1251);
//---------------------------------------------------------------------------
const double xx[7] = { 0.00001, -0.99, -1, -0.1, 0.1, 1, 0.99 };
#pragma argsused
void main()
{
    int n, i, k, z;
    double e, sl, sum, f, *x;
    SetConsoleOutputCP(1251);
    //randomize();
    printf("Vvedite e=? "); // приглашение – шрифт Lucida Console нужен
    scanf_s("%lf", &e); // ввод числа с плавающей точкой двойной точности(%lf) e
    if (e<1e-13 || e>0.11) {
        printf("Nekorrektnaya tochnost e (0..0.1] \nPress any key");
        _getch(); // ожидание нажатия клавиши
        return; // выход из функции main
    }
    fflush(stdin);
    printf("Vvedite n=? "); // приглашение
    scanf_s("%d", &n); // ввод десятичного(%d) n
    if (n<1 || n>20) {
        printf("Invalid n [1..20]! \nPress any key");
        _getch(); // ожидание нажатия клавиши
        return; // выход из функции main
    }
    fflush(stdin);
    x = new double[n]; // выделяем память для n элементов массива
    printf("Vvedite n=%d znacheniy X iz intervala (-1,+1):\n", n); // приглашение
    for (i = 0; i < n; i++) { // ввод x[0]...x[n-1]
        scanf_s("%lf", &x[i]); // типа long float (%lf)
        if (fabs(x[i]) >= 1) {
            x[i] = xx[rand() % 7];
            if (fabs(x[i]) == 1) {
                x[i] = x[i] * (rand() % 100) / 100;
                if (x[i] == 0) x[i] = e; // ддя некоторых вариантов x=/=0
            }
            printf("Nekorrektnoe znachenie izmeneno na %15.10lf\n", x[i]);
        }
    }
    z = ceil(fabs(log(e) / log(10))) + 1;
    printf("e = %*.*lf\n", z + 2, z, e); // вывод e:(z+2):z
    printf("N | X | Sum(X) | K| F(X) | |Sum(X)-F(X)|\n");
    for (i = 1; i < 80; i++) printf("="); printf("\n");
    for (i = 0; i < n; i++) {
        // поиск суммы ряда
        sum = sl = pow(x[i], 2); // sl=pow(x[i],2); sum=sl;
        k = 1;
        while ((fabs(sl) >= e) && (k != 500)) {
            sl *= sl(-(4 * i - 5) * x / (double)(4 * i));
            sum += sl;
            k++;
        };
        f = 4 * pow(1 + x[i], 0.25);
        printf("%2d|%17.*lf|%17.*lf|%2d|%17.*lf|%17.*lf\n",
            i + 1, z, x[i], z, sum, k, z, f, z + 2, fabs(sum - f));
    }
    delete[] x;
    printf("Press any key");
    _getch();
    return;
}



Автор: serega339344 13.5.2017, 11:23
Можно закрыть тему, задачу решил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)