Консультация № 188582
02.01.2016, 13:19
0.00 руб.
02.01.2016, 13:50
0 5 2
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
на языке С++ составить программу.
Условие:
Для х изменяющегося от a до b с шагом (b-a)/k, где
(k=10), вычислить функцию f(x), используя ее разложение в
степенной ряд в двух случаях:
а) для заданного n;
б) для заданной точности Е (Е=0.0001). Для сравнения найти точное значение функции.


Алгоритм решения задачи сводится к трем циклам, причем два из них вложены в третий. Внутренние циклы суммируют слагаемые при фиксированном параметре x, один (арифметический для заданного n), другой (итерационный для за-
данной точности Е. При организации этих циклов следует обратить внимание на правильный выбор формулы для вычисления элемента ряда an и правильное присвоение начальных значений переменным цикла. Внешний цикл организует изменение параметра х.

Обсуждение

давно
Посетитель
7438
7205
02.01.2016, 13:50
общий
Обратите внимание на этот вопрос
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Профессионал
304622
583
02.01.2016, 19:29
общий
это ответ
Здравствуйте, Трошков Владимир!

Примерно так:
[code h=200]#include <iostream>
#include <math.h>

using namespace std;

int main()
{
// Задаютя начальные значения (по условиям задачи
double a=0.1,b=0.8,E=0.0001;
int n=10;
// Вычисляется шаг
double dx=(b-a)/10;
// Для красоты
cout << "x f f_n f_E\n";
// Цикл for с индексом x, начинающимся от a,
// увеличивающимся на каждом шаге на dx, пока не превысит b
for (double x=a; x<=b; x+=dx)
{
// Точное значение f(x)
double f=x*atan(x) - log(sqrt(1+x*x));
cout << x << ' ' << f << ' ';
// Начальное значение для суммы ряда
f=0;
// Переменная предназначенная для вычисления x в степени 2n
double x_2n=1;
// Переменная предназначенная для получения +1/-1
int ke=-1;
// Перебираем i от 1 до n
for (int i=1; i<=n; i++)
{
// домножаем на x в квадрате и -1
x_2n *= x*x;
ke *= -1;
// Вычисляем слагаемое и добавляем к сумматору
f += ke*x_2n/(2*i)/(2*i-1);
}
// Сумма ряда для заданного n готова
cout << f << ' ';
// Заданово задаем начальные значения переменных
x_2n=1;
ke=-1;
f=0;
int i=1;
// Слагаемое надо будет вычислять в отдельной переменной
// т.к. по ней задаётся условие выхода
double fi;
do
{
// Те же самые вычисления
x_2n*=x*x;
ke*=-1;
fi=ke*x_2n/(2*i)/(2*i-1);
f+=fi;
i++;
// Для цикла while задаётся условие продолжения
// поока очередное слагаемое суммы ряда больше E
} while (fabs(fi)>E);
cout << f << endl;
}
return 0;
}
[/code]
5
давно
Посетитель
7438
7205
02.01.2016, 19:45
общий
это ответ
Здравствуйте, Трошков Владимир!
Вот мой вариант программы...
[code h=200]
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
double e = 0.0001; //погрешность
double a = 0.1; //начальное Х
double b = 0.8; //конечное Х
int k = 10; //количество интервалов по Х
int n = 10; //фиксированное число итераций
int i1, i2, i3; //переменные для циклов
double h = (b-a)/k; //шаг по Х
double x; //текущий Х
double xn; //накапливаемый Х для очередного сложения в итерациях
double sn; //один элемент ряда
double S1; //сумма ряда из n элементов
double S2; //сумма ряда, пока очередной элемент больше погрешности
double f; //точное значение функции

for(i1=0; i1<=k; i1++) //цикл по Х
{
x = a + i1*h; //очередное значение Х
f = x*atan(x)-log(sqrt(1+x*x)); //точное значение функции

for(S1=0,xn=-1,i2=1; i2<=n; i2++) //цикл суммирования ряда из n элементов
{ //сумма S1 в начале = 0, а частичное значение элемента ряда = -1
xn *= -x*x; //накапливаемое частичное значение элемента ряда
S1 += xn/((2*i2)*(2*i2-1)); //суммирование элемента ряда
}

for(S2=0,xn=-1,sn=1,i3=1; fabs(sn)>=e; i3++)//цикл суммирования ряда пока модуль элемента ряда >= e
{ //сумма S2 в начале = 0, а частичное значение элемента ряда = -1
//sn = 1, чтобы было справедливо условие fabs(sn)
xn *= -x*x; //накапливаемое частичное значение элемента ряда
sn = xn/((2*i3)*(2*i3-1)); //значение элемента ряда, сохраняем в переменной, чтобы потом сравнить с е
S2 += sn; //суммирование элемента ряда
}
//выводим полученные результаты:
//значение функции f(x), сумма ряда S1, сумма ряда S2,
// (в скобках количество просуммированных элементов)
//а также разность S1-f и S2-f
//в конце строки не ставим код перехода на новую строку(\n),
//т.к. строка заполняется до самого конца и
// переход на начало следующей строки осуществится автоматически
printf("f(%#.2g)=%#9.7f, S1(%d)=%#9.7f, S2(%d)=%#9.7f, e1=%3.2e, e2=%3.2e",
x, f, i2-1, S1, i3-1, S2, fabs(S1-f), fabs(S2-f));
}

return 0;
}
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399077
12
04.01.2016, 23:33
общий
04.01.2016, 23:36
Адресаты:
Спасибо вам!
Я решил сам написать..но у меня почему не сходится SN,SE..

Код:
#include <cstdlib>
#include <iostream>
#include <math.h>
#define A 0.1
#define B 0.8
#define E 10e-4
int main()
{
float x,k=(B-A)/10.0,sn=0,se=0,t,y;
int i,j,n=10;
for(x=A;x<=B;x+=k)
{
sn=x;se=x;
for(i=1;i<=n;i++)
{
sn+=pow((-1),n+1)*(pow(x,2*n))/(2*n*(2*n-1));
};
j=1;
do
{
t=pow((-1),j+1)*(pow(x,2*j))/(2*j*(2*j-1));
j++;
se+=t;
} while(t>E);
y=x*atan(x)-log(sqrt(1+pow(x,2)));
printf("x=%.2f SN=%f SE=%f Y=%f\n",x,sn,se,y);
}
return 0;
}


давно
Посетитель
7438
7205
04.01.2016, 23:53
общий
04.01.2016, 23:59
Адресаты:
Ошибки:
sn=0;se=0;
for(i=1;i<=n;i++)
{
sn+=pow((-1),i+1)*(pow(x,2*i))/(2*i*(2*i-1));
};
Я бы не рекомендовал использовать функцию pow, она дает дополнительную погрешность
Код:

sn=0;se=0;
for(i=1;i<=n;i++)
{
sn+=pow((-1),i+1)*(pow(x,2*i))/(2*i*(2*i-1));
};
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа