Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум1_2014.doc
Скачиваний:
19
Добавлен:
25.02.2016
Размер:
1.79 Mб
Скачать

Interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids;

type

TForm1 = class(TForm)

lbl1: TLabel;

lbl2: TLabel;

edt1: TEdit;

lbl3: TLabel;

edt2: TEdit;

sd: TStringGrid;

lbl4: TLabel;

btn1: TButton;

btn2: TBitBtn;

procedure FormActivate(Sender: TObject);

procedure btn1Click(Sender: TObject);

procedure edt2KeyPress(Sender: TObject; var Key: Char);

procedure edt1KeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

Implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);

begin

sd.Cells[0,0]:='Кол-во членов ряда';

sd.Cells[1,0]:='n-й член';

sd.Cells[2,0]:='Значение sin(x)';

end;

procedure TForm1.btn1Click(Sender: TObject);

var

n,t :integer;

eps,x,y,an :real;

begin

try //Защищенный блок

x:=StrToFloat(edt1.Text);

except

//Обработка ошибки конвертирования

on Econverterror do

begin

showmessage('Ошибка');

edt1.Text:='';

end;

end;

eps:=StrToFloat(edt2.Text);

t:=Trunc(-ln(eps)/ln(10))+1;//кол-во знаков после запятой

lbl4.Caption:='sin('+floattostrf(x,ffFixed,(t+2),t)+')= '+

floattostrf(Sin(x),ffFixed,t+2,t);

y:=x;

an:=x;

n:=0;

sd.RowCount:=2;

sd.Height:=2*sd.DefaultRowHeight+10;

sd.Cells[0,1]:=inttostr(n);

sd.Cells[1,1]:=floattostrf(an,ffFixed,t+2,t);

sd.Cells[2,1]:=floattostrf(y,ffFixed,t+2,t);

while abs(an) >=eps do

begin

inc(n);

an:=-an*sqr(x)/(2*n*(2*n+1));

y:=y+an;

sd.Cells[0,n+1]:=inttostr(n);

sd.Cells[1,n+1]:=floattostrf(an,ffFixed,t+2,t);

sd.Cells[2,n+1]:=floattostrf(y,ffFixed,t+2,t);

sd.RowCount:=sd.RowCount+1;//увеличивается кол-во строк

//и увеличивается высота таблицы

sd.Height:=sd.Height+sd.DefaultRowHeight+2;

end;

end;

procedure TForm1.edt2KeyPress(Sender: TObject; var Key: Char);

//Обработка нажатие клавиш при вводе epsilon

begin

case key of

'0'..'9',#8:;

',','.':begin

key:=decimalseparator;

if pos(decimalseparator,edt2.Text)<>0 then

key:=#0

end;

'E','e':begin

key:='E';

if ((pos('E',edt2.Text)<>0) or (pos('E',edt2.Text)<>0))

or ((length(edt2.Text)=1)

and ((copy(edt2.Text,1,1)='-') or

(copy(edt2.Text,1,1)='+'))) or

((length(edt2.Text)=0)

and

((pos('E',edt2.Text)=0) or (pos('e',edt2.Text)=0))) then

key:=#0;

end;

'-': if Pos('E',edt2.Text)<>Length(edt2.Text) then

key:=#0;

#13: btn1.SetFocus; //обработка нажатия клавиши Enter

else

key:=#0;

end;

end;

procedure TForm1.edt1KeyPress(Sender: TObject; var Key: Char);

//Обработка нажатие клавиш при вводе x

begin

case Key of

'0'..'9',',','-','+','e','E',#8:;

#13:edt2.SetFocus

else

key:=#0;

end;

end;

end.

Обратите внимание на количество знаков после запятой при выводе промежуточных и окончательных результатов.

Пример 3. Вычислите значение функции с точностью с помощью итерационной формулы Ньютона:

y0=x;

yi=0,5(yi + x/yi), i=1,2…

Вычисления продолжать, пока |y2x| > ε. Подсчитайте количество итераций.

Рис.3.3. Схема алгоритма программы

Текст программы

program lr3_3_1;

{Вычислите значение функции y=sqrt(x) с точностью eps с помощью формулы Ньютона }

{$APPTYPE CONSOLE}

uses

SysUtils;

var

n :integer;

eps,x,y :real;

begin

write('Vvedite x и eps ');

readln(x,eps);

y:=x;

n:=0;

while abs(sqr(y)-x) >eps do

begin

inc(n);

y:=0.5*(y+x/y);

end;

writeln('x= ',x:8:4,' eps= ',eps:8:4,' y= ',y:8:4,' n= ',n);

readln;

end.

Численные методы решения (уточнения)

алгебраических трансцендентных (неалгебраических)

уравнений вида f(x) = 0

Существуют несколько методов решения таких уравнений, наиболее известные следующие: половинного деления, хорд, касательных (Ньютона), комбинированный метод хорд и касательных, метод итераций, обратного интерполирования и другие. Рассмотрим некоторые из них. Будем считать, что во всех случаях корень отделен на отрезке [a; b].

Метод половинного деления

Берем середину отрезка [a; b], на котором отделен корень, за начальное приближение х0 и определяем, на какой из половинок находится корень. Если f(x0) = 0 или |f(x0)| < , то корень найден, иначе, если f(x0) 0 и произведение f(a)f(x0) < 0, то корень на отрезке [a; х0], иначе на отрезке [х0; b]. Далее уменьшаем отрезок [a; b] в два раза, полагая a = х0 или b = х0, в зависимости от того, на какой из двух половинок отделен корень, и снова находим середину отрезка [a; b]. Обычно вычисления продолжаются до тех пор, пока не будет выполнено одно из двух условий (иногда обоих одновременно) |f(x0)| < или |ba| < , где заданная абсолютная погрешность.

Метод хорд

Пусть f(a)f(b) < 0. Проведем через точки M(a, f(a)) и N(b, f(b)) прямую линию (хорду), уравнение которой записывается в следующем виде (уравнение прямой, проходящей через две заданные точки):

Найдем точку пересечения хорды с осью абсцисс:

(3.1)

За первое приближение корня уравнения примем х1. Второе приближение вычисляется по формуле (3.1) относительно того из отрезков [a; x1] и [x1; b], на концах которого функция f(x) принимает значения разных знаков. Аналогично вычисляются и следующие приближения.

Кроме того, предположим, что вторая производная на интервале(a; b) сохраняет знак. Тогда на (a; b) график функции y = f(x) выпуклый, если , и лежит выше любой своей хорды. В этом случае точка пересечения хорды находится между корнем уравненияf(x) = 0 и тем концом отрезка [a; b], в котором значение функции f(x) положительно. Если же то график функцииy = f(x) на интервале (a; b) вогнутый и лежит ниже любой своей хорды. В этом случае точка пересечения хорды находится между корнем уравнения f(x) = 0 и тем концом отрезка [a; b], в котором значение функции f(x) отрицательно. Следовательно, во всех случаях приближенное значение корня лежит между точным его значением и тем концом отрезка [a; b], в котором знаки f(x) и противоположны.

Поэтому, если известно (n1)-е приближение корня, то его n-е приближение можно вычислить по формуле

для случая

или по формуле

для случая

На практике вычисление приближенных значений продолжают до тех пор, пока два последовательных приближения xn и xn-1 не будут удовлетворять условию |xnxn-1| < . Но из выполнения этого условия не следует, что |x* xn| < , где х* искомый корень уравнения.

Более надежным практическим критерием окончания счета является выполнение неравенства

Метод касательных (Ньютона)

Пусть f(a)f(b)<0 и сохраняет знак на интервале(a; b). Проведем касательную к графику функции y = f(x) в том конце отрезка [a; b], в котором знаки f(х) и совпадают. Уравнение касательной имеет вид:

если

если

Найдем точку пересечения касательной с осью абсцисс. Полагая у = 0, находим

если

если

Полученное таким образом х1 примем за приближенное значение корня. Последующие приближения вычисляются по формуле:

Вычисления повторяют до тех пор, пока не выполнится одно из условий

или

Комбинированный метод

Данный метод основан на использовании двух предыдущих методов (хорд и касательных) одновременно. С одного конца отрезка [a; b] приближаемся к корню методом хорд, с другого – методом касательных. Процесс повторяется, пока модуль разности между этими приближениями не станет меньше заданной погрешности.

Метод итерации (последовательных приближений)

В соответствии с этим методом уравнение f(x) = 0 заменяется уравнением x = (x).

Если (x) такая, что , то процесс итерации сходится. В качестве начального приближения x1 тогда можно взять любое значение из [a; b]. Последующие приближения вычисляются по формуле:

xn = (xn-1), n = 2, 3, …

Вычисления повторяют до тех пор, пока не выполнится условие

|xnxn-1| < .

Задания

Разработайте алгоритм, программу и контрольные примеры. Испытайте программу на контрольных примерах.

1. Значение функции sin2(x) можно вычислить с помощью разложения ее в ряд Маклорена

Вычислите sin2(x) с точностью EPS, т.е. вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

2. Введите два натуральных числа m и n. Проверьте, являются ли данные числа взаимно-простыми.

3. Изменяя х от а с шагом h, определите, при каком значении х SIN(x) станет больше COS(x).

4. Найдите наименьшее общее кратное натуральных чисел k, m, n.

5. Напишите программу сложения двух рациональных дробей. Если полученный результат является сократимой дробью, то сократите эту дробь.

6. Найдите корни уравнения ех – 10х = 0 с точностью методом простой итерации.

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

8. Найдите корень уравнения tg(1,5773х) – 2,3041х = 0 с точностью методом простой итерации.

9. Найдите корень уравнения ln(7,622x) – 8,59х +10,5 = 0 с точностью методом простой итерации.

10. Найдите корни уравнения 9,33sin(6,977x) – 7,25х = 0 с точностью методом простой итерации.

11. Вычислите и выведите на экран значения функции превосходящие для х, принимающего значения 1, 2, … . Значение введите с клавиатуры.

12. Введите натуральное число n. Определите количество цифр в этом числе.

13. Вычислите значения функции y = sin(ax) для x, изменяющегося от 1 с шагом 1 до тех пор, пока данная функция возрастает. Значение а введите с клавиатуры.

14. Уточните корень уравнения ех – 10х = 0 на отрезке [a, b] методом половинного деления. Для того, чтобы на отрезке [a, b] был корень достаточно, чтобы f(а) и f(b) были разных знаков. В качестве первого приближения х можно взять середину отрезка [a, b], а затем в качестве нового отрезка, на котором необходимо искать корень, нужно взять тот из двух отрезков [a, x] и [x, a], на концах которого функция f(х) принимает значения разных знаков. Итерационный процесс продолжайте, пока длина отрезка и модуль f(х) не станут меньше заданной малой величины EPS.

15. Вычислите значение числа с заданной точностью, используя формулу Выведите количество слагаемых, которое понадобилось для вычислений.

16. Вычислите значение числа с заданной точностью, используя формулу

17. Уточните корень уравнения ех – 10х = 0 на отрезке [a, b] методом хорд.

18. Уточните корень уравнения ех – 10х = 0 на отрезке [a, b] методом касательных.

19. Уточните корень уравнения ех – 10х = 0 на отрезке [a, b] комбинированным методом хорд и касательных.

20. Вычислите значение квадратного корня с точностью EPS с использованием итерационной формулы Ньютона:

Y0 = 1

Yi = 1/2 (Yi-1 + X/Yi-1) (i = 1, 2, 3, ...).

Вычисления производить пока |YiYi-1| не станет меньше EPS. Определите количество итераций, за которое достигается эта точность.

21. Найдите сумму членов ряда S = 1 + 1/2 + 1/4 + 1/8 + ...

Сумму вычислять, пока очередной член ряда не станет меньше ЕРS.

22. Вычислите значение кубического корня с точностью EPS с использованием итерационной формулы Ньютона:

Y0 = 1

Yi = 1/3 (2Yi-1 + X/Y 2i-1) (i = 1, 2, 3, ...).

Вычисления производить пока |YiYi-1| не станет меньше EPS. Определите количество итераций, за которое достигается эта точность.

23. Алгоритм Евклида нахождения НОД(m, n) основан на следующих свойствах этой величины: пусть m и n – два натуральных числа и пусть mn. Тогда для чисел m, n и r, где r – остаток от деления m на n, выполняется равенство НОД(m, n) = НОД(n, r). Используя алгоритм Евклида, найдите наибольший общий делитель m и n.

24. Значение функции LN(1 + X) можно вычислить с помощью разложения ее в ряд Маклорена

LN(1 + X) = XХ2/2 + Х3/3 – Х4/4 + ...

Вычислите LN(1 + X) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

25. Значение функции y(x)=(ex + e-x)/2 можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

26. Значение функции y(x)=cos(x) можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

27. Значение функции y(x)=(ex - e-x)/2 можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

28. Значение функции y(x)=arctg(x) можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

29. Значение функции y(x)=2(coc2(x)-1) можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

30. Значение функции y(x)=sin(x)/x можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

31. Значение функции можно вычислить с помощью разложения ее в ряд Маклорена

.

Вычислите y(x) с точностью EPS, т.е., вычисление суммы ряда нужно продолжать до тех пор, пока абсолютная величина очередного члена ряда не станет меньше EPS. Определите количество членов ряда, которое для этого понадобилось.

Даны два натуральных числа m и n (1 < m < n). Найдите наименьшее k, при котором mk > n.

32. Генерируйте случайные числа из отрезка [1; 10] и находите их сумму пока модуль разности между последовательными двумя числами больше 1.

33. Найдите приближенно с точностью до 0,01 наибольшее значение функции на отрезке [x1; x2]. Значения a, b, c, d, e, x1, x2 введите с клавиатуры.

34. Дано целое число m > 10. Получите наибольшее целое k, при котором 4k < m.

35. Дано натуральное число n. Получите наименьшее натуральное число вида m2, превосходящее n.

36. Вычислите значение корня n-ой степени с точностью EPS с использованием итерационной формулы Ньютона:

Y0 = 1

Yi = 1/n ((n-1)Yi-1 + X/Y n-1i-1) (i = 1, 2, 3, ...).

Вычисления производить пока |YiYi-1| не станет меньше EPS. Определите количество итераций, за которое достигается эта точность.

Дополнительные задания

37. Вычислите сумму ряда с заданной степенью точности :

38. Вычислите сумму ряда с заданной степенью точности :

39. Вычислите сумму ряда с заданной степенью точности :

40. Вычислите сумму ряда с заданной степенью точности :

41. Вычислите сумму ряда с заданной степенью точности

:

42. Вычислите сумму ряда с заданной степенью точности

:

43. Вычислите сумму ряда с заданной степенью точности :

44. Вычислите сумму ряда с заданной степенью точности :

45. Вычислите сумму ряда с заданной степенью точности

:

46. Вычислите сумму ряда с заданной степенью точности

:

47. Вычислите сумму ряда с заданной степенью точности

:

48. Вычислите сумму ряда с заданной степенью точности :

49. Вычислите сумму ряда с заданной степенью точности

:

50. Вычислите сумму ряда с заданной степенью точности :

51. Вычислите сумму ряда с заданной степенью точности :

52. Вычислите сумму ряда с заданной степенью точности

:

53. Вычислите сумму ряда с заданной степенью точности

:

54. Вычислите сумму ряда с заданной степенью точности :

55. Вычислите сумму ряда с заданной степенью точности

:

56. Вычислите сумму ряда с заданной степенью точности :

57. Вычислите сумму ряда с заданной степенью точности :

58. Вычислите сумму ряда с заданной степенью точности :

59. Вычислите сумму ряда с заданной степенью точности :

60. Вычислите сумму ряда с заданной степенью точности :

61. Вычислите сумму ряда с заданной степенью точности :

62. Вычислите сумму ряда с заданной степенью точности :

63. Вычислите сумму ряда с заданной степенью точности :

64. Вычислите сумму ряда с заданной степенью точности :

65. Вычислите сумму ряда с заданной степенью точности :

66. Вычислите сумму ряда с заданной степенью точности :

67. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

;

68. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

69. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

70. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

71. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

72. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

73. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

74. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

75. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

76. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

77. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

78. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

79. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

80. Вычислите значение функции с помощью ряда Маклорена с заданной точностью S(x) и с помощью стандартных функций Delphi Y(x):

Лабораторная работа 4

Обработка одномерных массивов

Цель работы: формирование первичных умений в разработке простых циклических программ с использованием массивов.

Что нужно знать для выполнения работы

1. Структуру цикла, назначение и порядок следования его отдельных частей.

2. Структуры: цикл-пока и цикл-повторить.

3. Операторы цикла for …to (downto) … do.

4. Описание и использование массивов.

Примеры выполнения задания лабораторной работы

Пример 1. Составьте программу нахождения суммы элементов данного массива а, состоящего из n элементов.

Решение. Основная часть цикла – добавление очередного элемента к накапливаемой сумме. Для нахождения суммы всех элементов достаточно повторить цикл, изменяя номер элемента массива от 1 до n с шагом 1 (рис. 4.1).

На данной схеме вывод исходных данных и вывод результата записаны в одном блоке, так как алгоритм вывода элементов массива аналогичен циклу ввода.

Рис. 4.1. Схема алгоритма программы

Текст программы

program lr4_1_1;

{Сумма элементов массива.}

{$APPTYPE CONSOLE}

uses

SysUtils;

const

maxn=100;{Максимальное количество элементов массива}

var

n,i:integer;

s:real;

a:array[1..maxn] of real;

begin

write('n= ');

readln(n);{Ввод реального количества элементов массива}

writeln('Vvedite elementi massiva a ');

for i:=1 to n do

begin

write('a[',i,']= ');

readln(a[i]);

end;

s:=0;

for i:=1 to n do

s:=s+a[i];

writeln('Исходный массив a, состоящий из',n:4,' элементов');

for i:=1 to n do

write(a[i]:8:2);

writeln;

writeln('S = ',s:8:2);

readln;

end.

Как и в лабораторной работе 3 в данной работе можно считать заданиями повышенной сложности (второго уровня) задания, выполненные с использованием компонентов Delphi.

Для отображения элементов массивов целесообразно использовать компоненты StringGrid. Для ввода элементов массива в ячейки таблицы необходимо свойство Options(goEditing) положить равным true.

Для рассмотренного примера форма приложения может быть как показано на рис. 4.1.

Рис. 4.1 Форма приложения примера 4_1

Текст Unit-a

unit Unit1;

//нахождение суммы элементов массива