вот задание ..(вычисление функции с помощью разложения в ряд)..Вычислить и вывести на экран в виде таблицы значения функции , заданной с помощью ряда Тейлора на интервале от Хнач до Хкон с шагом dx и с точностью E.КАждая строка таблицы должна содержать значение аргумента,значение функции и количество просуммированных членов ряда.
ФУНКЦИЯ: Ln(x)=(сумма по n от 0 до бесконечности)*((-1)^n*(x-1)^(n+1)/(n+1))=(x-1)-(((x-1)^2)/2)+(((x-1)^3)/3)+…. 0<x<=2
всё вроде бы работает,но какие-то проблемы с точностью вычисления..
24 мая 2009 в 12:02
спасибо.
23 мая 2009 в 11:04
это не скопление бреда. это один маленький кусочек бреда, который я вам показал. сами подумайте:
S = 0;
S1 = log(x);
while (fabs(S1-S)>eps)
{
S1=(-x*n-x+n+1)/(n+2);
n+=1;
}
ваша программа усиленно придумывает новые значения для S1, ожидая, пока S1 не станет отличаться от S (постоянно равного нулю) на непревышающую eps величину.
да, и еще:
(-x*n-x+n+1)/(n+2)=(-x*(n+1)+(n+1))/(n+2)=-(x-1)*(n+1)/(n+2)
ваше реккурентное соотношение выглядит подозрительно с точки зрения накопления вычислительной ошибки (не считая того, что оно совсем не используется) и имеет неверное начальное значение, которое должно равняться нулевому члену с соответствующим знаком (т.е. просто x-1).
далее, для следующего члена ваше соотношение должно дать -(x-1)*(x-1)/2, а дает -(x-1)*(x-1)*2/3. почему? учитывая, что отсчет n вами ведется от 1, ваше соотношение должно было бы принять вид -(x-1)*n/(n+1).
в общем,
S=0;
S1=x-1;
while(fabs(S1/2)>eps){
S+=S1;
S1*=-(x-1)*n/(n+1);
n++;
}
23 мая 2009 в 1:01
S1=(-x*n-x+n+1)/(n+2);–рекуррентное соотношение
в общем эта прога-скорее скопление бреда))
23 мая 2009 в 0:03
про мое сообщение о том, что с точностью в порядке – можете забыть. это не ваш случай.
23 мая 2009 в 0:02
я не вижу "(сумма по n от 0 до бесконечности)*((-1)^n*(x-1)^(n+1)/(n+1))" в вашем коде.
while (fabs(S1-S)>eps)
{
S1=(-x*n-x+n+1)/(n+2);
n+=1;
}
что это?
22 мая 2009 в 23:03
ааа,я совсем))
вот текст проги..
#include <math.h>
#include <iostream.h>
void main()
{
double Xn, Xk, dX, eps;
cout <<"Enter Xn" << endl;
cin >> Xn;
cout << "Enter Xk" << endl;
cin >> Xk;
cout << "Enter dX" << endl;
cin >> dX ;
cout << "Enter eps" << endl;
cin >> eps ;
cout << " __________________________________" << endl;
cout << "| | ||" << endl;
cout << "| X | Ln(x)|N| " << endl;
cout << "|_________|_______________|________|" << endl;
for (double x = Xn; x<= Xk; x += dX)
{
int n = 1;
double S, S1;
S = 0;
S1 = log(x);
while (fabs(S1-S)>eps)
{
S1=(-x*n-x+n+1)/(n+2);
n+=1;
}
cout << "|" << x << "|" << S << " | " << n << "|" <<" "<<S1<< endl;
cout << " ———————————–" << endl;
}
}
22 мая 2009 в 23:03
спасибо!))))щас посмотрю)
22 мая 2009 в 23:02
все в порядке с точностью. просто логарифм в таком виде сходится очень медленно: //ru.wikipedia.org/wiki/Логарифм#.D0.9D.D0.B0.D...