5 / 5 / 0
Регистрация: 23.11.2011
Сообщений: 83
1

Рекуррентная формула для функции

10.04.2012, 18:45. Показов 9614. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, программа выводит неправильное значение, задание было таковым:Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от Хнач до Хконеч с шагом dx и с точностью eps

Мне сказали, что проще это выполнить с помощью рекуррентной формулы, которую мне дали, но результат выводится неверный,не могли бы вы мне помочь?
Вот сам код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<math.h>
#include<conio.h>
int main()
{
float eps, dx, x, b, sum=0;
int n=1;
printf("\nVvedite eps, dx\n");
scanf("%f%f", &eps, &dx);
for(x>=-1; x<1; x+=dx)
{b=-1;
do{sum+=b; n++; b*=-(x/(n+1));}
while(fabs(b)>eps);
printf("\nx=%g,\t sum=%g", x, sum);}
getch();
return 0;
}
Миниатюры
Рекуррентная формула для функции  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2012, 18:45
Ответы с готовыми решениями:

Рекуррентная формула
Помогите пожалуйста составить рекуррентную формулу. Сколько прочитал, так и не могу понять.

Ребят,пожалуйста,какая тут рекуррентная формула?
f(x)=\frac{x}{2}-\frac{2}{3}{x}^{2}+\frac{3}{4}{x}^{3}-\frac{4}{5}{x}^{4}+...,\varepsilon ={10}^{-5}

Рекуррентная формула
Составьте, пожалуйста, рекуррентную формулу:

Рекуррентная формула
Пожалуйста помогите вывести рекуррентную формулу!!! Вот пример для VBA: ch...

8
5 / 5 / 0
Регистрация: 23.11.2011
Сообщений: 83
10.04.2012, 23:12  [ТС] 2
sum=-1 выводит при любых данных, а х=5.76543е-039 -получается число такой конструкции, только числа другие, помогите плз, уже не знаю что делать...
0
5 / 5 / 0
Регистрация: 23.11.2011
Сообщений: 83
13.04.2012, 11:37  [ТС] 3
Ну что ребят, есть у кого-нибудь какие-либо идеи?
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.04.2012, 22:38 4
Формула с факториалами неправильная. Там факториала быть не должно и числа все, а не только чётные.
В цикле for в первом поле задаётся начальное значение, поэтому там должно быть не ">=", а просто "=". Сумму и номер члена надо инициализировать на каждой итерации цикла.

Вот более правильный код.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<math.h>
#include<conio.h>
 
int main()
{
    double eps, dx, x;
    printf("\nVvedite eps, dx\n");
    scanf("%lf%lf", &eps, &dx);
    for (x = -1; x < 1; x += dx)
    {
        int n = 2;
        double b = x*x, sum = -x;
        while (fabs(b) >= n*eps) {
            sum -= b/n;
            b *= x;
            ++n;
        }
        printf("\nx=%g,\t sum=%g", x, sum);
    }
    getch();
    return 0;
}
Но и здесь осталась одна проблема. Подобное окончание итерации по достижению заданной точности хорошо работает лишь для знакопеременных, либо очень быстро сходящихся рядов. Когда x близок к единице получается ряд, который сходится очень медленно, так что погрешность будет много больше заданной. Надо что-то придумать.
1
5 / 5 / 0
Регистрация: 23.11.2011
Сообщений: 83
15.04.2012, 22:45  [ТС] 5
Спасибо, я сейчас пробывал переделать сам, вот что получилось, но выдает 5 ошибок
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
#include <stdio.h>
#include<math.h>
int main()
{
float sum, x, xn, xk, eps, i, dx;
do
{
printf("xn= ");
scanf("%f", &xn);
printf("xk= ");
scanf("%f", &xk);
if(xn > xk);
{printf("xn doljno bit < xk\n");
}
}
printf("dx= ");
scanf("%f", &dx);
printf("x= ");
 
for(i=xn; i<=xk>eps; i+=dx)
{
x=(double)i;
sum=iter=0;
n=1;
do{
iter*=pow(x,n)/n;
sum+=iter;
n++;
}
while(fabs(iter)>eps);
printf("\nx=%g,\t sum=%g", x, sum);
return 0;
}
}
Добавлено через 2 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Формула с факториалами неправильная. Там факториала быть не должно и числа все, а не только чётные.
В цикле for в первом поле задаётся начальное значение, поэтому там должно быть не ">=", а просто "=". Сумму и номер члена надо инициализировать на каждой итерации цикла.

Вот более правильный код.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<math.h>
#include<conio.h>
 
int main()
{
    double eps, dx, x;
    printf("\nVvedite eps, dx\n");
    scanf("%lf%lf", &eps, &dx);
    for (x = -1; x < 1; x += dx)
    {
        int n = 2;
        double b = x*x, sum = -x;
        while (fabs(b) >= n*eps) {
            sum -= b/n;
            b *= x;
            ++n;
        }
        printf("\nx=%g,\t sum=%g", x, sum);
    }
    getch();
    return 0;
}
Но и здесь осталась одна проблема. Подобное окончание итерации по достижению заданной точности хорошо работает лишь для знакопеременных, либо очень быстро сходящихся рядов. Когда x близок к единице получается ряд, который сходится очень медленно, так что погрешность будет много больше заданной. Надо что-то придумать.
Я так понимаю мой второй код тоже неправильный?
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.04.2012, 22:57 6
Цитата Сообщение от ZveRb34 Посмотреть сообщение
Я так понимаю мой второй код тоже неправильный?
Ну, помимо синтаксических ошибок там и семантические тоже остались.
Например: iter инициализируется нулём, а потом домножается на число. Ноль на что не умножай — получится ноль. Да и не нужно его умножать, ведь pow(x, n)/n это уже готовый член суммы (правда без рекуррентного способа вычисления). В 20-й строчке в for какое-то странное условие i<=xk>eps. Наверное >eps здесь случайный мусор.
1
5 / 5 / 0
Регистрация: 23.11.2011
Сообщений: 83
15.04.2012, 23:13  [ТС] 7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну, помимо синтаксических ошибок там и семантические тоже остались.
Например: iter инициализируется нулём, а потом домножается на число. Ноль на что не умножай — получится ноль. Да и не нужно его умножать, ведь pow(x, n)/n это уже готовый член суммы (правда без рекуррентного способа вычисления). В 20-й строчке в for какое-то странное условие i<=xk>eps. Наверное >eps здесь случайный мусор.
Ну можно и другим способом, мне просто сказали, что по другому нельзя вычислить ни как...

Добавлено через 10 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну, помимо синтаксических ошибок там и семантические тоже остались.
Например: iter инициализируется нулём, а потом домножается на число. Ноль на что не умножай — получится ноль. Да и не нужно его умножать, ведь pow(x, n)/n это уже готовый член суммы (правда без рекуррентного способа вычисления). В 20-й строчке в for какое-то странное условие i<=xk>eps. Наверное >eps здесь случайный мусор.
Вот так наверно получше будет
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
#include <stdio.h>
#include<math.h>
int main()
{
float sum, x, xn, xk, eps, i, dx, iter, n;
do
{
printf("xn= ");
scanf("%f", &xn);
printf("xk= ");
scanf("%f", &xk);
if(xn > xk);
{printf("xn doljno bit < xk\n");
}
}
printf("dx= ");
scanf("%f", &dx);
printf("x= ");
scanf("%f", &x);
for(i=xn; i<=xk; i+=dx)
{
x=(double)i;
sum=iter=1;
n=1;
do{
iter*=pow(x,n)/n;
sum+=iter;
n++;
}
while(fabs(iter)>eps);
printf("\nx=%g,\t sum=%g", x, sum);
return 0;
}
}
Но все равно выдает ошибку в 16 строке
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.04.2012, 23:17 8
Цитата Сообщение от ZveRb34 Посмотреть сообщение
Но все равно выдает ошибку в 16 строке
В строке 6 открыт цикл do { } while(), а в строке 15 блок цикла закрылся, а ключевого слова while нет.

Добавлено через 36 секунд
А ещё в строке 12 лишняя точка с запятой.
0
5 / 5 / 0
Регистрация: 23.11.2011
Сообщений: 83
15.04.2012, 23:45  [ТС] 9
Цитата Сообщение от grizlik78 Посмотреть сообщение
В строке 6 открыт цикл do { } while(), а в строке 15 блок цикла закрылся, а ключевого слова while нет.

Добавлено через 36 секунд
А ещё в строке 12 лишняя точка с запятой.
т.е. если мы подставим
C
1
2
3
4
5
6
7
8
do
{
printf("xn= ");
scanf("%f", &xn);
printf("xk= ");
scanf("%f", &xk);
}
while(xn>xk)
Мы ведь можем убрать
C
1
2
3
if(xn > xk)
{printf("xn doljno bit < xk\n");
}
Хотя нет, что-то я чушь сморозил...А с другой стороны зачем нам он вообще тут нужен?ведь в этом цикле вычислений никаких нету
C
1
2
3
4
5
6
7
8
9
10
11
do
{
printf("xn= ");
scanf("%f", &xn);
printf("xk= ");
scanf("%f", &xk);
if(xn > xk)
{printf("xn doljno bit < xk\n");
}
}
while()
Добавлено через 9 минут
Вот так вроде должно быть
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
#include <stdio.h>
#include<math.h>
int main()
{
float sum, x, xn, xk, eps, i, dx, iter, n;
printf("xn= ");
scanf("%f", &xn);
printf("xk= ");
scanf("%f", &xk);
if(xn > xk)
{printf("xn doljno bit < xk\n");
}
printf("dx= ");
scanf("%f", &dx);
printf("x= ");
scanf("%f", &x);
for(i=xn; i<=xk; i+=dx)
{
x=(double)i;
sum=iter=1;
n=1;
do{
iter*=pow(x,n)/n;
sum+=iter;
n++;
}
while(fabs(iter)>eps);
printf("\nx=%g,\t sum=%g", x, sum);
return 0;
}
}
0
15.04.2012, 23:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2012, 23:45
Помогаю со студенческими работами здесь

Рекуррентная формула
Здравствуйте, для написания программы для вычисления функций ряда Тайлора, необходимо вывести...

Рекуррентная формула
Совсем забыл как делаются рекуррентные формулы. Есть сумма \sum_{k=0...

рекуррентная формула
Пользуясь рекуррентной формулой, найти сумму S бесконечного ряда с точностью до e, где...

Рекуррентная формула
Помогите пожалуйста вывести рекуррентную формулу для этого!!И если не трудно саму формулу как...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru