Условие:
Вычислить сумму S=(Summa)An(x) при различных значениях параметра х. Вычисляемая сумма является разложением в ряд некоторой функции y=f(x), которую также необходимо вычислить для каждого значения х, изменяющегося с шагом h=0,1 и принадлежащего интервалу, указанному в варианте задания*. При расчете сумм ряда количество членов ряда взять исходя из условия:
Результаты программы должны содержать:
- значения x,
- значения функции y,
- значения сумм S , а также
- абсолютное значение разности |S-y| для каждого значения аргумента х.
Пояснения к вычислению:
Для вычисления сумм S целесообразно (если это возможно) использовать рекуррентные соотношения, то есть выражать последующий член ряда через предыдущий.
*Вариант задания:
Решение:
Решение любой задачи программирования лучше начинать с примерного алгоритма решения, которое записано на языке, понятном любому человеку. Это делается для того, чтобы тому, кто будет после вас работать с программной частью, было легче разобраться в "исходниках" вашей программы.
Итак, словесный алгоритм:
- сначала подключаем библиотеки stdio.h и math.h - потому что в программе будут использоваться математические выражения и операции стандартного ввода/вывода.
- создадим функцию вещественного типа, которая вычисляет у(х) по варианту задания. И сделаем возвращение этой переменной к начальному значению. Это и называется рекуррентным соотношением.
- в главной функции мы создадим цикл для вычисления нужных нам параметров. Будем использовать цикл for и цикл с постусловием do - while. Итак опишем все действия в циклах:
До тех пока i<1, при этом i начальное 0.1, а прибавляется шаг h=0.1, вычислять y для каждого значения i. Присвоим начальное значение суммы s=0, что дальше делать? К начальному значению s прибавляем s*pow(0.1,2)/(2*(i+1)*(2*i+1)) – найдено из формулы, которая есть в задании, до тех пор пока модуль разности s-y будет больше или равен 0.01 выполнять действия, как меньше стал модуль - выводим то, что требовалось в задании.
Исходный код:
#include <math.h>
float func(float x) //рекуррентная функция
{
float y;
y = exp(x)+exp(-x)/2
return y;
}
int main()
{
float y,s,i;
for(i=0.1;i<=1;i+=0.1)
{
s=1; //начальное значение суммы So=1
y=func(i);
do
{
s+=s*pow(i,2)/(2*(i+1)*(2*i+1));
}
while((fabs(s-y)=>0.01));
printf("x=%f\ty(x)=%f\ts=%f\t|s-y(x)|=%f\n",i,y,s,fabs(s-y));
}
return 0;
}
Результат:
P.S.: в следующий раз также наглядно рассмотрим, как использовать одномерные массивы в решении похожей задачи.
Если вам нравится то, что мы пишем, пожалуйста, нажмите на интересующую вас рекламу сбоку, сверху, или сразу после статьи. Будет стимул писать лучше и чаще. Хорошего вам дня.