Пример выполнения задания с использованием цикла while

 

Упростив вычисления за счет использования дополнительных переменных и/или скобочных форм, вычислить значения функции

eX2

Y(X)=Xsin(10X)

 

и ее производной

 

Y'(X)=X(eX210 cos(10X)−2XeX2sin(10X))−eX2sin(10X)

X2

 

на интервале значений Х от 40o до 50o с шагом 1o.

 

Для проверки правильности вычислений Y′ вычислить её значение по формуле

 

без преобразований,а также поразностной схемеY'(X)≈Y(X+ ∆X/ 2)Y(X−∆X/ 2)

 

X

 

при X=10-8.

 

Результаты вычислений вывести в виде таблицы с заголовками столбцов. В нача-ле каждой строки должен быть порядковый номер и соответствующее значение аргумен-та Х.

 

После отладки программы при значениях Х, изменяющихся от 40o до 50o с шагом 1o, добавить в программу ввод значений переменных A, B и H, которые должны пред-ставлять:

 

A - начало, B - конец диапазона значений X, H - шаг изменения X. Протестировать рабо-ту программы при разных вводимых данных.

 

#include"stdafx.h"

 

«Практикум по программированию на языке C в среде VS C++»

 


 

#include "math.h"

 

int _tmain(int argc, _TCHAR* argv[])

 

{

 

const double Pi=3.14;

 

double H=1;//Шаг изменения аргумента в градусах double A=40;//Начальное значение аргумента в градусах double B=50;//Конечное значение аргумента в градусах double F1,X,Y,P,P1,C,D,E,S;

 

int I;

 

//ЧТОБЫ ОТЛАДИТЬ ПРОГРАММУ С НАЧАЛЬНЫМИ ЗНАЧЕНИЯМИ A, B и H, //СДЕЛАЙТЕ КОММЕНТАРИЕМ СЛЕДУЮЩИЕ ОПЕРАТОРЫ printf И scanf

 

printf("Enter A, B, H:");    
scanf("%lf%lf%lf",&A,&B,&H);  
//Перевод градусов в радианы  
A=Pi*A/180;      
H=Pi*H/180;      
B=Pi*B/180+H/2;      
//Вывод заголовка таблицы.  
printf("\n # X Y(X) P\
P1   F1");  

 

X=A;//ПеременнаяXбудет представлять//текущее значение аргумента

 

I=0;//ПеременнаяIбудет представлять номер строки таблицыwhile(X<B)

{

 

//Увеличение значения счетчика строк таблицы

 

I=I+1;

 

//Вычисление значений дополнительных переменных

 

C=X*X; D=10*X; E=exp(-C); S=sin(D);

 

//Вычисление: Y - значения функции и // P - ее производной

//с использованием дополнительных переменных.

 

Y=E*S/X;

 

P= E*(D*cos(D)-S*(1+2*C))/C;

 

«Практикум по программированию на языке C в среде VS C++»

 


 

//Вычисление P1 - контрольного значения //производной без использования //дополнительных переменных.

 

P1=((exp(-X*X)*10.0*cos(10*X) -2*X*exp(-X*X)*sin(10*X))*X -exp(-X*X)*sin(10*X))/X/X;

 

//Вычисление F1 - контрольного значения //производной по разностной схеме.

F1=( exp(-(X+5E-9)*(X+5E-9))*sin(10*(X+5E-9))/(X+5E-9)

 

 

-exp(-(X-5E-9)*(X-5E-9))*sin(10*(X-5E-9))/(X-5E-9) )/1E-8;

//Вывод в строку таблицы вычисленных значений printf("\n%3d%8.2lf%10.5lf%11.5lf%16.10lf%16.10lf"

 

,I,X*180/Pi,Y,P,P1,F1 );

 

X=X+H; //Увеличение значения аргумента

 

}//whileprintf("\n");

 

return0;

 

}

 

При выводе заголовка таблиы управляющую строковую константу в операторе printf пришлось продолжить с начала новой строки текста программы, использовав знак

переноса \. Для выражений нет необходимости использования знака переноса, если про-должение текста выражения происходит на знаке операции, как, например, в операторах, вычисляющих значения переменных P1 и F1.

 

Результат работы программы при вводе исходных данных будет иметь вид.

 

Enter A, B, H:40 50 1

 

 

# X Y(X) P P1 F1
40.00 0.56371 5.17198 5.1719834346 5.1719833971
41.00 0.64022 3.60082 3.6008211921 3.6008211635
42.00 0.68954 2.06375 2.0637549307 2.0637549114
43.00 0.71268 0.60541 0.6054120938 0.6054120871
44.00 0.71134 -0.73589 -0.7358908651 -0.7358908483
45.00 0.68787 -1.92882 -1.9288233230 -1.9288233011

 

«Практикум по программированию на языке C в среде VS C++»

 


 

46.00 0.64505 -2.94945 -2.9494455353 -2.9494455323
47.00 0.58606 -3.78135 -3.7813491750 -3.7813491449
48.00 0.51428 -4.41555 -4.4155472441 -4.4155472168
49.00 0.43317 -4.85013 -4.8501348030 -4.8501347771
50.00 0.34620 -5.08975 -5.0897482960 -5.0897481951

 

 

Обратите внимание на достаточно близкие, с точностью до 7-го .. 8-го знака зна-чения производной, вычисленные по аналитически полученной и по разностной форму-лам. Однако следует иметь в виду, что подобное сходство значений не всегда возможно и зависит как от самой функции, так и от значения аргумента и от точности представле-ния данных в машине.