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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2009, 13:49   #1
R@Ziel
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 14
По умолчанию Ряд тейлора ln(x)

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от хнач до хкон с шагом dx с точностью ε. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.

ln(x)=pow(-1,n)*(pow((-1.0),n)*pow((x-1.0),(n+1.0)))/(n+1.0) 0<x<=2

Код:
#include <iostream>
#include <conio.h>
#include <math.h>
#include <iomanip>
#include <locale>
using namespace std;
//
int main()
{//начало кода функции main
	setlocale (0,"rus");
	double Xn, Xk, x, dx, t, elem, p,test=0;//объявление пременных
	long n;
	do{
	cout<<"Введите Xнач. и Xкон.(0<x<=2)"<<endl;
	cin>>Xn>>Xk;
if (Xn<=0 && Xn<=Xk && Xn<=2 && Xk<=2) {cout << "Введенные значения не удовлетворяют условию!(0<x<=2)!"; getchar(); getchar(); return 0;}
cout<<"Введите точность"<<endl;
cin>>t;
if (!(10e-5<t || t<10e-2)){ cout<<"не правильное значение!"; getchar(); getchar(); return 0;}
cout<<"Введите Шаг"<<endl;
cin>>dx;
//Шапка для таблицы
cout<<"------------------------------\n";
cout<<"   x   |      F     |  n  |  ln(x) ";
cout<<endl;
//досюда все правильно!!!!!!!!!!!!!!!!!
for(x=Xn;Xn<=Xk; x+=dx)
 {
	n=0;
	elem=(x-1);
	p=0;
		while(fabs(elem)>t)//пока ряд тайлора меньше точности выполнять действия
		{
		elem=(pow((-1.0),n)*pow((x-1.0),(n+1.0)))/(n+1.0);//общая формула
		if ((n % 2)==0) p=p-elem;// если n четная то прибавляем 
			else p=p+elem;//иначе вычитаем из обещей формулы
		n++;
		}
	cout << setw(6)<<setprecision(3)<<x<<" | "<<setw(10)<<setprecision(3)<<elem<<" | ";//setw(длина) setprecision(количество знаков после запятой
	cout << setw(6)<<n<<" | "<<setw(6)<<setprecision(3)<<p<<endl;
}
//стоп до нажатия клавиши
system("pause");test++;}while(test>9);
return 0;
}//конец кода функции main
Cобствено сама проблема в что программа зависает не выполняя последнии 2 строки кода т.е system("pause");test++;}while(test> 9);
return 0;
}

Последний раз редактировалось R@Ziel; 13.11.2009 в 14:26.
R@Ziel вне форума Ответить с цитированием
Старый 13.11.2009, 14:11   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
while(fabs(elem)>t)//пока ряд тайлора меньше точности
Ой ли?
И пользуйтесь тегом CODE, для чего выделите текст и нажмите значок #
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 13.11.2009, 14:48   #3
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Программа туда не добирается. Поставьте точку останова на
Код:
system("pause");
и увидите, что Вы туда не добираетесь.
Код:
ln(x)=pow(-1,n)*(pow((-1.0),n)*pow((x-1.0),(n+1.0)))/(n+1.0) 0<x<=2
Вы в формуле ничего не пропустили? По моему там где-то д.б. сумма и n не вещественное ,а целое, т.е запись n+1.0 не совсем правильная.
А по поводу предыдущего, то у Вас написано:
До тех пор, пока ряд Тейлора больше точности.
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 13.11.2009 в 15:21.
Sweta вне форума Ответить с цитированием
Старый 13.11.2009, 14:54   #4
R@Ziel
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 14
По умолчанию

Я так полагаю проблема сдесь вот только вопрос в чем??
Код:
for(x=Xn;Xn<=Xk; x+=dx)
 {
	n=0;
	elem=(x-1);
	p=0;
		while(fabs(elem)>t)//пока ряд тайлора меньше точности выполнять действия
		{
		elem=(pow((-1.0),n)*pow((x-1.0),(n+1.0)))/(n+1.0);//общая формула
		if ((n % 2)==0) p=p-elem;/
			else p=p+elem;//
		n++;
		}
	cout << setw(6)<<setprecision(3)<<x<<" | "<<setw(10)<<setprecision(3)<<elem<<" | ";//setw(длина) setprecision(количество знаков после запятой
	cout << setw(6)<<n<<" | "<<setw(6)<<setprecision(3)<<p<<endl;
}

Последний раз редактировалось R@Ziel; 13.11.2009 в 14:56.
R@Ziel вне форума Ответить с цитированием
Старый 13.11.2009, 15:47   #5
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Одну ошибочку словила.
Код:
for(x=Xn;Xn<=Xk; x+=dx)
д.б.
Код:
for(x=Xn;x<=Xk; x+=dx)
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 13.11.2009, 15:48   #6
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Вот здесь вот ошиблись
Код:
for(x=Xn;Xn<=Xk; x+=dx)
Вместо Xn в условии Xn <= Xk должен быть x
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 13.11.2009, 16:01   #7
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Держите свою программку.
Там еще одна ошибка 0 нельзя возводить в степень!!

Код:
#include <iostream>
#include <conio.h>
#include <math.h>
#include <iomanip>
#include <locale>
using namespace std;
//
int main()
{//начало кода функции main
setlocale (0,"rus");
double Xn, Xk, x, dx, t, elem, p,test=0;//объявление пременных
int n;
//do
//{
cout<<"Введите Xнач. и Xкон.(0<x<=2)"<<endl;
cin>>Xn>>Xk;
while ( (Xn<=0) || (Xn>=Xk) || (Xk>2))
{
cout << "Введенные значения не удовлетворяют условию!(0<x<=2)!"<<endl;
cout << "Попытайтесть еще !"<<endl;
cin>>Xn>>Xk;
}
getchar();
getchar();

cout<<"Введите точность"<<endl;
cin>>t;
while ((t<0.00001)||(t>0.01))
{
cout<<"не правильное значение! попытайтесь еще!"<<endl;
cin>>t;
}
getchar();
getchar();

cout<<"Введите Шаг"<<endl;
cin>>dx;
//Шапка для таблицы
cout<<"------------------------------\n";
cout<<" x | F | n | ln(x) ";
cout<<endl;
//досюда все правильно!!!!!!!!!!!!!!!!!
for(x=Xn;x<=Xk; x+=dx)
{
n=0;
elem=(x-1);
p=0;
while(fabs(elem)>t)//пока ряд тайлора меньше точности выполнять действия
{
if(x!=1)
elem=(pow((-1),n)*pow((x-1.0),(n+1)))/(n+1);//общая формула
else
elem=0;
if ((n % 2)==0)
p=p-elem;// если n четная то прибавляем
else
p=p+elem;//иначе вычитаем из обещей формулы
n++;//приращение n на единицу тоже самое что n=n+1 или n+=1
}
cout << setw(6)<<setprecision(3)<<x
<<" | "<<setw(10)<<setprecision(3)<<elem<<" | ";//setw(длина) setprecision(количество знаков после запятой
cout << setw(6)<<n<<" | "<<setw(6)<<setprecision(3)<<p<<endl;
}
//стоп до нажатия клавиши
//while(test> 9);
getch();
//system("pause");
return 0;
}//конец кода функции main/code
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 13.11.2009, 17:12   #8
R@Ziel
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 14
По умолчанию

результат компиляции последнего кода:
1>------ Rebuild All started: Project: lz3, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'lz3', configuration 'Debug|Win32'
1>Compiling...
1>2zadanie.cpp
1>c:\documents and settings\admin\мои документы\visual studio 2005\projects\lz3\lz3\2zadanie.cpp( 49) : error C2668: 'pow' : ambiguous call to overloaded function
1> c:\program files\microsoft visual studio 8\vc\include\math.h(575): could be 'long double pow(long double,int)'
1> c:\program files\microsoft visual studio 8\vc\include\math.h(527): or 'float pow(float,int)'
1> c:\program files\microsoft visual studio 8\vc\include\math.h(489): or 'double pow(double,int)'
1> while trying to match the argument list '(int, int)'
1>Build log was saved at "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\lz3\lz3\Debug\BuildLo g.htm"
1>lz3 - 1 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Последний раз редактировалось R@Ziel; 13.11.2009 в 17:17.
R@Ziel вне форума Ответить с цитированием
Старый 13.11.2009, 17:26   #9
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

У меня С++Builder6 работает. Вот результат
попробуйте вместо
Код:
 if(x!=1) и 
elem=0;
написать
Код:
if(x!=1.0) и
elem=0.0;
Изображения
Тип файла: jpg вып.JPG (154.1 Кб, 135 просмотров)
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 13.11.2009 в 17:34.
Sweta вне форума Ответить с цитированием
Старый 13.11.2009, 17:48   #10
R@Ziel
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 14
По умолчанию

у еня заработало когда поменял elem=(pow((-1),n)*pow((x-1.0),(n+1)))/(n+1); на 1.0
R@Ziel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ряд Тейлора в паскале Ku6ep Помощь студентам 2 10.04.2010 20:16
Ошибка сегментации при вызове system("PAUSE") Lavisa Общие вопросы C/C++ 9 01.08.2009 18:14
Ошибка сегментации при вызове system("PAUSE") Lavisa Помощь студентам 0 29.07.2009 17:43
Подскажите кто-нибудь в чем отличие между system("pause"); и getch(); какую лучше использовать? Paul_AG Общие вопросы C/C++ 7 24.03.2009 19:32
Ряд Тейлора siriusz Общие вопросы C/C++ 6 06.02.2009 20:26