Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 5458
∙ повысить рейтинг »
CradleA
Статус: Профессионал
Рейтинг: 1402
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 213
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1830
Дата выхода:07.01.2016, 13:51
Администратор рассылки:F®ost (Администратор)
Подписчиков / экспертов:15 / 13
Вопросов / ответов:1 / 2

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

Консультация # 188582:

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


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

Дата отправки: 02.01.2016, 13:19
Вопрос задал: Трошков Владимир (Посетитель)
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Сергей Бендер (Профессионал):

Здравствуйте, Трошков Владимир!

Примерно так:

Код :
#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;
}

Консультировал: Сергей Бендер (Профессионал)
Дата отправки: 02.01.2016, 19:29

5
нет комментария
-----
Дата оценки: 04.01.2016, 21:28

Рейтинг ответа:

НЕ одобряю +2 одобряю!


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Трошков Владимир!
Вот мой вариант программы...

Код :
#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;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 02.01.2016, 19:45

5
нет комментария
-----
Дата оценки: 04.01.2016, 21:28

Рейтинг ответа:

НЕ одобряю +2 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное