Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 1. 6 вар. Трофимов-2019.pdf
Скачиваний:
285
Добавлен:
19.02.2020
Размер:
175.99 Кб
Скачать

AПрограммный анализ бесконечно малых

1using static System.Math;

2using System;

3

4namespace MathUtilities

5{

6

7

8

9

///<summary>

///Исследует бесконечно малые функции.

///</summary>

public class InfinitesimalAnalyzer

10{

11/// <summary>

12/// Степени десятки для составления табличного вида БМФ.

13/// </summary>

14private static readonly double[] PowersOfTen = new double[]{

15

1, 1E-01, 1E-02, 1E-03, 1E-04, 1E-05, 1E-06, 1E-07, 1E-08, 1E-09,

 

,! 1E-10, 1E-11, 1E-12, 1E-13, 1E-14, 1E-15

16

};

17

18/// <summary>

19/// Функция для исследования.

20/// </summary>

21public Func<double, double> Function { get; set; }

22

23/// <summary>

24/// Типичный конструктор для создания новой функции.

25/// </summary>

26/// <param name="function">функция для исследования</param>

27public InfinitesimalAnalyzer(Func<double, double> function)

28{

29

Function = function;

30

}

31

32/// <summary>

33/// Определяет, является ли функция бесконечно малой.

34/// </summary>

35/// <returns>истина, если функция бесконечно мала</returns>

36public bool IsInfinitesimal() =>

37

Function(0) == 0;

38

39/// <summary>

40/// Определяет табличный вид функции, в том числе логарифмическую

,! таблицу.

41/// </summary>

42/// <param name="start">с какой позиции начинать</param>

15

43/// <param name="amount">количество ячеек; не более 16; start + amount <= ,! 16</param>

44/// <returns>массив с ячейками</returns>

45public TableItem[] GetTableRepresentation(uint start = 0, uint amount =

 

,! 16)

46

{

47

if (amount > 16)

48

throw new ArgumentException("количетсво ячеек не более 16");

49

 

50

51

52

if (start + amount > 16)

throw new ArgumentException("нельзя пытаться вылезти за 16");

53

54

55

// 16 степеней десятки у нас есть

var answer = new TableItem[amount - start];

56

// все степени

и значения функции при этих аргументах добавляем в

 

,! массив

 

57

for (int i = (int) start; i < amount; i++)

58

answer[i -

start] = new TableItem{

59

Input

= PowersOfTen[i],

60

Output = Function(PowersOfTen[i])

61

};

 

62

 

 

63

64

65

66

67

68

69

70

71

return answer;

}

///<summary>

///Определяет асимптоту lg-графика.

///</summary>

public Asymptote GetAsymptote() => new Asymptote(Function);

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

///<summary>

///Определяет коэффициент `C` БМФ.

///</summary>

public double GetCoefficient() => Pow(10, GetAsymptote().K);

}

///<summary>

///Представляет собой ячейку в табличном виде функции.

///</summary>

public struct TableItem

{

///<summary>

///Аргумент функции.

///</summary>

16

87

88

public double Input { get; set; }

89

90

91

92

93

///<summary>

///Значение функции.

///</summary>

public double Output { get; set; }

94

95

96

97

98

///<summary>

///Десятичный логарифм аргумента функции.

///</summary>

public double LgInput { get => Log10(Input); }

99/// <summary>

100/// Десятичный логарифм значения функции.

101/// </summary>

102/// <remark>

103/// Вычисляет логарифм значения по модулю.

104/// </remark>

105public double LgOutput { get => Log10(Abs(Output)); }

106}

107

108

109

110

111

112

113

114

115

116

117

///<summary>

///Представляет собой асимптоту lg-графика.

///</summary>

public class Asymptote

{

///<summary>

///Коэфициент при X.

///</summary>

public double Alpha { get; set; }

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

///<summary>

///Свободный член.

///</summary>

public double K { get; set; }

///<summary>

///Создаёт асимптоту

///</summary>

///<param name="function"></param>

public Asymptote(Func<double, double> function)

{

//по сути, коэф находится там, где

//если хотя бы два отрезка представляют собой прямую линию;

//но предположим, контрольная точка находится на точке lg(h) = -4

var left = Pow(10, -4);

var right = Pow(10, -4.001);

17

134

 

135

Alpha = LogOfAbs(function(right) / function(left)) / Log10(right /

 

,! left);

136

K = -1 * Log10(right) * LogOfAbs(function(left) / function(right)) /

 

,! Log10(left / right) + LogOfAbs(function(right));

137

}

138

 

139

private double LogOfAbs(double a) =>

140

Log10(Abs(a));

141}

142}

18