Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 10:57   #1
Andrag
 
Регистрация: 22.01.2010
Сообщений: 4
По умолчанию Разложение функции, Ряд Тейлора.

Здравствуйте!
Мне нужно написать программу разложения в ряд функции ln(x), (x-1)-((x-1)^2)/2+((x-1)^3)/3+...+((-1)^(n+1)) * ((x-1)^n)/n, 0<x<2, язык Си.
Программу я написал, но, как говорят мои товарищи, 2 и 3 столбец в таблице должны совпадать, однако у меня этого совпадения нет. Подскажите, пожалуйста. Вот программа

Код:
#include <stdio.h>
#include <math.h>
void main () {
double Xn, Xk, X, h, eps, sum, seps;
int n,i;
while(1)
{printf("\n Insert Xstart and Xfinish, 0<x<2 : ");
if (scanf("%lg%lg", &Xn, &Xk)==EOF) break;
printf("\n Insert shag: ");
if (scanf("%lg", &h)==EOF) break;
printf("\n Insert tochnost: ");
if (scanf("%lg", &eps)==EOF) break;
if (Xn<0 && Xk<0 || Xn>2 && Xk>2) continue;
printf(" \xDA\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xBF\n");
printf(" \xB3     X     \xB3   ln(x)   \xB3   ryad    \xB3     N     \xB3\n");
printf(" \xC3\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xB4\n");
for(X=Xn;X<=Xk;X+=h) {
i=0;
n=1;
sum=0;
do {seps=-1*(X-1)/n;
i++;
n++;
sum+=seps;
seps*=seps;
}while(seps>eps);
printf(" \xB3%11.4lg",X);
printf("\xB3%11.4lg",log(X));
printf("\xB3%11.4lg",sum);
printf("\xB3%11.0d",i);
printf("\xB3\n");
}
printf(" \xC0\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xD9\n");
}
}

Последний раз редактировалось Stilet; 22.01.2010 в 12:00.
Andrag вне форума Ответить с цитированием
Старый 22.01.2010, 12:02   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
do {seps=-1*(X-1)/n;
i++;
n++;
sum+=seps;
seps*=seps;
}while(seps>eps);
Вот смотрите
Код:
seps=-1*(X-1)/n
Код:
seps*=seps;
при n=3 получим ((-1)*(X-1)/1)*((-1)*(X-1)/2)*((-1)*(X-1)/3), что не соответствует Вашей формуле.
д.б
Код:
seps= pow(-1.0,(n+1))*pow((X-1.0),n)/n;
seps>eps, здесь необходимо
Код:
fabs(seps)>eps
так как у Вас есть отрицательные значения.
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 22.01.2010 в 12:49.
Sweta вне форума Ответить с цитированием
Старый 22.01.2010, 12:13   #3
Andrag
 
Регистрация: 22.01.2010
Сообщений: 4
По умолчанию

Спасибо! Вот только проблема в том, что преподаватель не разрешил использовать "pow" в написании, так как раньше эта функция очень загружала компьютер...

Последний раз редактировалось Andrag; 22.01.2010 в 12:27.
Andrag вне форума Ответить с цитированием
Старый 22.01.2010, 12:54   #4
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Тогда
seps=-1*(X-1);
seps=(-1)*seps;
sum+=seps/n;
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 22.01.2010, 13:06   #5
Andrag
 
Регистрация: 22.01.2010
Сообщений: 4
По умолчанию

Не работает, пишет:
Floating point error: Divide by 0.
Andrag вне форума Ответить с цитированием
Старый 22.01.2010, 14:20   #6
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

У меня в Builder работает.
Код:
#include <stdio.h>
#include <math.h>
void main () {
double Xn, Xk, X, h, eps, sum, seps;
int n;
while(1)
{printf("\n Insert Xstart and Xfinish, 0<x<2 : ");
if (scanf("%lg%lg", &Xn, &Xk)==EOF) break;
printf("\n Insert shag: ");
if (scanf("%lg", &h)==EOF) break;
printf("\n Insert tochnost: ");
if (scanf("%lg", &eps)==EOF) break;
if (Xn<0 && Xk<0 || Xn>2 && Xk>2) continue;
printf(" \xDA\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xBF\n");
printf(" \xB3     X     \xB3   ln(x)   \xB3   ryad    \xB3     N     \xB3\n");
printf(" \xC3\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xB4\n");
for(X=Xn;X<=Xk;X+=h) {
n=1;
sum=0;
seps=-1;
do {
if(X!=1)
{
seps=seps*(-1)*(X-1);
sum=sum+seps/n;
}
else
sum=0;
n++;
}
while(fabs(seps/(n-1))>eps);

printf(" \xB3%11.4lg",X);
printf("\xB3%11.4lg",log(X));
printf("\xB3%11.4lg",sum);
printf("\xB3%11.0d",n-1);
printf("\xB3\n");
}
printf(" \xC0\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xD9\n");
}
}
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 22.01.2010, 14:41   #7
Andrag
 
Регистрация: 22.01.2010
Сообщений: 4
По умолчанию

Спасибо Вам большое, все работает!
Andrag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массивы; разложение функции в ряд Тейлора.... lTIGRAl Помощь студентам 3 28.12.2009 17:52
Одномерный массивы, разложение функции в ряд Тейлора...... lTIGRAl Помощь студентам 0 28.12.2009 15:30
Лабораторная на С++ (Массивы, разложение в ряд Тейлора) AxGreg Помощь студентам 5 06.11.2009 17:43