Числовые ряды C++

364
21 января 2017, 11:44

Есть задание

Для каждого x, изменяющегося от a до b с шагом h, найти значения функ-ции Y(x), суммы S(x) и |Y(x)–S(x)| и вывести в виде таблицы. Значения a, b, h и n вводятся с клавиатуры. Так как значение S(x) является рядом разложения функции Y(x), при пра-вильном решении значения S и Y для заданного аргумента x (для тестовых значе-ний исходных данных) должны совпадать в целой части и в первых двух-четырех позициях после десятичной точки. Работу программы проверить для a = 0,1; b = 1,0; h = 0,1; значение парамет-ра n выбрать в зависимости от задания (10, 20, 50, 100).

Не сходятся цифры, видит может кто ошибку? Помогите пожалуйста!

{
    double a, b, h, x, y, s, r;
    int k, n, zn;
    a = StrToFloat(Edit1->Text);
    h = StrToFloat(Edit2->Text);
    b = StrToFloat(Edit3->Text);
    n = StrToFloat(Edit4->Text);
    for (x = a; x <= b; x += h)
    {
        s = 1;
        r = 1;
        zn = -1;
        for (k = 1; k <= n; k++)
        {
            r *= zn * ((x * x) / (2 * k + 2));
            s += r;
        }
        y = sin(x);
        Memo1->Lines->Add("яЁш x= " + FloatToStrF(x, ffFixed, 8, 2) +
                          " ёєььр S(x)= " + FloatToStrF(s, ffFixed, 8, 6) + " Y(x)= "
                          + FloatToStrF(y, ffFixed, 8, 6));
    }
}
Answer 1

Не те первые члены ряда (первый член не 1, а x), не на тот знаменатель делите:

И еще - этот ряд сходится к синусу, а не к косинусу. Вы точно привели в условии верный ряд?

Вот, в консольном, так сказать, варианте:

int main()
{
    double
        a = 0.0,
        b = 1.6,
        h = 0.1;
    int n = 5;
    for(double x = a; x <= b; x+= h)
    {
        double sum = x, term = x, x2 = x*x;
        for(int k = 1; k <= n; ++k)
            sum += term *= -x2/(2*k*(2*k+1));
        printf("%.3lf   %8.5lf   %8.5lf\n",x,sum,sin(x));
    }
}

А вот - для косинуса:

for(double x = a; x <= b; x+= h)
{
    double sum = 1, term = 1, x2 = x*x;
    for(int k = 1; k <= n; ++k)
        sum += term *= -x2/(2*k*(2*k-1));
    printf("%.3lf   %8.5lf   %8.5lf\n",x,sum,cos(x));
}

Update
Раз все так непонятно...



READ ALSO
Содержит ли данный код UB?

Содержит ли данный код UB?

Содержит ли данный код UB?

285
Работа с потоками boost

Работа с потоками boost

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

316
Поиск ближайшего значения в массиве

Поиск ближайшего значения в массиве

Допустим, дано расписание автобусов на какой-то день, в виде списка числовых значенийОпределить ближайший к текущему времени автобус

284