Advertisement
stupid_pro

task3_v1

Feb 17th, 2024 (edited)
815
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 11.69 KB | None | 0 0
  1. program t3;
  2.  
  3. uses cthreads, ptcGraph;
  4.  
  5. type
  6.     function_t = function(x: double): double;
  7.  
  8. {$F+}
  9.  
  10. { функция 1 }
  11. function Func1(x: double): double;
  12. begin
  13.     Func1 := 3 * (0.5 / (x + 1) + 1);
  14. end;
  15.  
  16. { первая производная функции 1 }
  17. function Func1prime1 (x: double): double;
  18. begin
  19.     Func1prime1 := -6 / ((2 * x + 2) * (2 * x + 2));
  20. end;
  21.  
  22. { вторая производная функции 1 }
  23. function Func1prime2 (x: double): double;
  24. begin
  25.     Func1prime2 := 3 * ((x + 1) * (x + 1) * (x + 1));
  26. end;
  27.  
  28.  
  29. { функция 2 }
  30. function Func2 (x: double): double;
  31. begin
  32.     Func2 := 2.5 * x - 9.5;
  33. end;
  34.  
  35. { первая производная функции 2 }
  36. function Func2prime1 (x: double): double;
  37. begin
  38.     Func2prime1 := 2.5;
  39. end;
  40.  
  41. { вторая производная функции 2 }
  42. function Func2prime2 (x: double): double;
  43. begin
  44.     Func2prime2 := 0;
  45. end;
  46.  
  47.  
  48. { функция 3 }
  49. function Func3 (x: double): double;
  50. begin
  51.     Func3 := 5 / x;
  52. end;
  53.  
  54. { первая производная функции 3 }
  55. function Func3prime1 (x: double): double;
  56. begin
  57.     Func3prime1 := -5 / (x * x);
  58. end;
  59.  
  60. { вторая производная функции 3 }
  61. function Func3prime2 (x: double): double;
  62. begin
  63.     Func3prime2 := 10 / (x * x * x);
  64. end;
  65.  
  66. { функция, которая находит абсциссу точки пересечения функций;
  67. функция1, первая производная функции1, вторая производная функции1,
  68. функция2, первая производная функции2, вторая производная функции2,
  69. начало, конец, точность
  70. h(x) = f(x) - g(x) }
  71. function Root(f, f1, f2: function_t; g, g1, g2: function_t; a, b: double; eps1: double): double;
  72. var x, x0: double;
  73. begin
  74.     if (f(a) - g(a)) * (f2(a) - g2(a)) > 0 then
  75.     begin
  76.         x0 := a;
  77.     end
  78.     else if (f(b) - g(b)) * (f2(b) - g2(b)) > 0 then
  79.     begin
  80.         x0 := b;
  81.     end
  82.     else writeln('Неверный интервал');
  83.  
  84.     x := x0 - (f(x0) - g(x0)) / (f1(x0) - g1(x0));
  85.  
  86.     while abs(x - x0) >= eps1 do
  87.     begin
  88.         x0 := x - (f(x) - g(x)) / (f1(x) - g1(x));
  89.         x := x0 - (f(x0) - g(x0)) / (f1(x0) - g1(x0));
  90.         writeln(x, ' сходимость корня');
  91.     end;
  92.  
  93.     Root := x;
  94. end;
  95.  
  96. function Integral(f: function_t; a, b: double; eps2: double): double;
  97. { число разбиений - n }
  98. var n: integer = 4;
  99.     i: integer;
  100.     h, firstIntegral, secondIntegral, s, aCopy: double;
  101. begin
  102.  
  103. repeat
  104.     n := n + 1;
  105.  
  106.     h := (b - a) / n;
  107.     firstIntegral := 0;
  108.     aCopy := a;
  109.  
  110.     for i := 1 to n do
  111.     begin
  112.         s := (f(aCopy) + f(aCopy + h)) / 2 * h;
  113.         firstIntegral := firstIntegral + s;
  114.         aCopy := aCopy + h;
  115.     end;
  116.  
  117.     h := (b - a) / (2 * n);
  118.     secondIntegral := 0;
  119.     aCopy := a;
  120.  
  121.     for i := 1 to (2 * n) do
  122.     begin
  123.         s := (f(aCopy) + f(aCopy + h)) / 2 * h;
  124.         secondIntegral := secondIntegral + s;
  125.         aCopy := aCopy + h;
  126.     end;
  127.  
  128.     writeln(firstIntegral, ' ', secondIntegral, ' первый интеграл и второй интеграл');
  129.  
  130. until (1 / 3 * abs(firstIntegral - secondIntegral) <= eps2);
  131.  
  132.     Integral := secondIntegral;
  133. end;
  134.  
  135. procedure Graph(f1, f2, f3: function_t; x1, x2, x3: double);
  136.     var
  137.         GD, { graph driver }
  138.         GM, { graph mode }
  139.         n, { количество засечек }
  140.         x0, y0, { начальные координаты }
  141.         x_coord, y_coord, { координаты на графике }
  142.         xLeft, xRight, yDown, yUp, { значения на осях }
  143.         borderLeft, borderRight, borderDown, borderUp, { граница }
  144.         i,
  145.         runner: integer;
  146.         scaleX, scaleY, { масштаб }
  147.         x, dx, x_num,
  148.         y, dy, y_num: real;
  149.         word, point1, point2, point3: string;
  150.     begin
  151.         GD := VGA;
  152.         GM := VGAHi;
  153.  
  154.         InitGraph(GD, GM, '');
  155.         SetColor(12109509);
  156.  
  157.         { сколько отступаем слева и справа, расположение графика }
  158.         borderLeft := 50; borderRight := GetMaxX - 50;
  159.         borderDown := 50; borderUp := GetMaxY - 50;
  160.         xLeft := 0; xRight := 6; dx := 0.5;
  161.         yDown := -1; yUp := 5; dy := 0.5;
  162.  
  163.         { сопоставление координат }
  164.         scaleX := (borderRight - borderLeft) / (xRight - xLeft); { масшnаб по X }
  165.         scaleY := (borderUp - borderDown) / (yUp - yDown); { масштаб по Y }
  166.         x0 := borderRight - trunc(xRight*scaleX); { точка (0, 0) в нашей СК }
  167.         y0 := borderDown + trunc(yUp*scaleY);
  168.  
  169.         { изображение осей }
  170.         Line(borderLeft, y0, borderRight, y0); { ось X }
  171.         Line(x0, borderDown, x0, borderUp); { ось Y }
  172.  
  173.  
  174.         { подписываем оси }
  175.         SetColor(6139362);
  176.         SetTextStyle(1, 0, 1);
  177.         OutTextXY(GetMaxX - 30, y0, 'OX');
  178.         OutTextXY(x0, 30, 'OY');
  179.  
  180.         { засечки на OX }
  181.         SetColor(16044095);
  182.         OutTextXY(x0 - 10, y0 + 10, '0');
  183.         n := round((xRight - xLeft) / dx) + 1;
  184.  
  185.         for i := 1 to n do
  186.         begin
  187.             { координата на бумаге }
  188.             x_num := xLeft + (i - 1)*dx;
  189.  
  190.             { координата в окне }
  191.             x_coord := borderLeft + trunc((x_num - xLeft) * scaleX);
  192.  
  193.             { оставляем штрих }
  194.             Line(x_coord, y0 - 3, x_coord, y0 + 3);
  195.  
  196.             { оставляем число, если не нуль }
  197.             str(x_num:0:1, word);
  198.             if (abs(x_num) > 1E-10) then
  199.                 OutTextXY(x_coord - TextWidth(word) div 2, y0 + 10, word)
  200.         end;
  201.  
  202.         { рисуем засечки на OY }
  203.         n := round((yUp - yDown)/dy) + 1;
  204.         for i := 1 to n do
  205.         begin
  206.             y_num := yDown + (i - 1)*dy;
  207.  
  208.             { координата в окне }
  209.             y_coord := borderUp - trunc((y_num - yDown)*scaleY);
  210.  
  211.             { оставляем штрих }
  212.             Line(x0-3, y_coord, x0+3, y_coord);
  213.  
  214.             { оставляем число, если не нуль }
  215.             str(y_num:0:1, word);
  216.             if (abs(y_num) > 1E-10) then
  217.                 OutTextXY(x0+10, y_coord - TextHeight(word) div 2, word)
  218.         end;
  219.  
  220.         { график F1 }
  221.         SetColor(9062);
  222.         OutTextXY(x0+50, y0-trunc(Func1(0) * scaleY)-90, 'y = 3 * (0.5 / (x + 1) + 1)');
  223.         x := xLeft;
  224.  
  225.         while (x <= xRight) do
  226.         begin
  227.             { вычисляем значение функции }
  228.             y := Func1(x);
  229.  
  230.             { координаты в окне }
  231.             x_coord := x0 + round(x * scaleX);
  232.             y_coord := y0 - round(y * scaleY);
  233.  
  234.             if (y_coord >= borderDown) and (y_coord <= borderUp) then
  235.             begin
  236.                 PutPixel(x_coord, y_coord, 9062);
  237.                 PutPixel(x_coord - 1, y_coord - 1, 9062)
  238.             end;
  239.  
  240.             x := x + 0.00001
  241.         end;
  242.  
  243.         { график F2 }
  244.         SetColor(15000);
  245.         OutTextXY(x0 - trunc(scaleX) - 50, y0 - trunc(Func2(-1) * scaleY) + 20, 'y = 2.5 * x - 9.5');
  246.         x := -1;
  247.  
  248.         while (x <= xRight) do
  249.         begin
  250.             { вычисляем значение функции }
  251.             y := Func2(x);
  252.             { координаты в окне }
  253.             x_coord := x0 + round(x*scaleX);
  254.             y_coord := y0 - round(y*scaleY);
  255.  
  256.             if (y_coord >= borderDown) and (y_coord <= borderUp) then
  257.             begin
  258.                 PutPixel(x_coord, y_coord, 15000);
  259.                 PutPixel(x_coord-1, y_coord-1, 15000)
  260.             end;
  261.             x := x + 0.00001
  262.         end;
  263.  
  264.         { график F3 }
  265.         SetColor(896269);
  266.         OutTextXY(x0 - trunc(scaleX) - 90, y0 - trunc(Func3(-1) * scaleY) - 30, 'y = exp(-x)');
  267.         x := xLeft;
  268.         while (x <= xRight) do
  269.         begin
  270.             { вычисляем значение функции }
  271.             y := Func3(x);
  272.             { координаты в окне }
  273.             x_coord := x0 + round(x * scaleX);
  274.             y_coord := y0 - round(y * scaleY);
  275.  
  276.             if (y_coord >= borderDown) and (y_coord <= borderUp) then
  277.             begin
  278.                 PutPixel(x_coord, y_coord, 896269);
  279.                 PutPixel(x_coord - 1, y_coord - 1, 896269)
  280.             end;
  281.             x := x + 0.00001
  282.         end;
  283.  
  284.         { отмечаем точки пересечения }
  285.         SetColor(13611962);
  286.         Str(x1:0:4, point1);
  287.         Str(x2:0:4, point2);
  288.         Str(x3:0:4, point3);
  289.         point1 := 'x1 =' + point1;
  290.         point2 := 'x2 =' + point2;
  291.         point3 := 'x3 =' + point3;
  292.         OutTextXY(x0 + trunc(x1*scaleX) - 70, y0 + 40, point1);
  293.         OutTextXY(x0 + trunc(x2*scaleX), y0 + 40, point2);
  294.         OutTextXY(x0 + trunc(x3*scaleX) - 30, y0 + 55, point3);
  295.  
  296.         { опускаем перпендикуляры }
  297.         line(x0 + round(x1 * scaleX), y0 - round(Func1(x1) * scaleY), x0 + round(x1 * scaleX), y0);
  298.         line(x0 + round(x2 * scaleX), y0 - round(Func3(x2) * scaleY), x0 + round(x2 * scaleX), y0);
  299.         line(x0 + round(x3 * scaleX), y0 - round(Func1(x3) * scaleY), x0 + round(x3 * scaleX), y0);
  300.  
  301.         SetColor(1234565);
  302.         x := x1;
  303.         while (x <= x3) do
  304.         begin
  305.             if (y0 - round(func2(x) * scaleY)) < (y0 - round(func3(x) * scaleY)) then
  306.                 line(x0 + round(x * scaleX), y0 - round(func1(x) * scaleY),
  307.                      x0 + round(x * scaleX), y0 - round(func2(x) * scaleY))
  308.             else
  309.                 line(x0 + round(x * scaleX), y0 - round(func1(x) * scaleY),
  310.                      x0 + round(x * scaleX), y0 - round(func3(x) * scaleY));
  311.             x += 0.00001;
  312.         end;
  313.         Readln;
  314.     end;
  315.  
  316. {СДЕЛАТЬ, ЧТОБ ЭПСИЛОНЫ ВВОДИЛИСЬ С КЛАВИАТУРЫ}
  317. {коориднаты абсцисс точек пересечения}
  318. var x1, x2, x3: double;
  319.     code: integer;
  320. {вычисленные значения интегралов соответсвующих функций}
  321.     i1, i2, i3, i: double;
  322.     eps1, eps2: double;
  323.  
  324. begin
  325.     if ParamCount <> 2 then
  326.     begin
  327.         writeln('Неверное число аргументов во входной строке!');
  328.         Halt(1);
  329.     end;
  330.  
  331.     val(ParamStr(1), eps1, code);
  332.     val(ParamStr(2), eps2, code);
  333.  
  334.     if (eps1 < 0) or (eps1 > 1) or (eps2 < 0) or (eps2 > 1) then
  335.     begin
  336.         writeln('Некорректный epsilon');
  337.         Halt(1);
  338.     end;
  339.  
  340.     x1 := Root(@Func1, @Func1prime1, @Func1prime2, @Func3, @Func3prime1, @Func3prime2, 1, 2, eps1);
  341.     x2 := Root(@Func2, @Func2prime1, @Func2prime2, @Func3, @Func3prime1, @Func3prime2, 4, 5, eps1);
  342.     x3 := Root(@Func1, @Func1prime1, @Func1prime2, @Func2, @Func2prime1, @Func2prime2, 5, 5.5, eps1);
  343.  
  344.    writeln(x1:0:10, ' - первый корень');
  345.    writeln(x2:0:10, ' - второй корень');
  346.    writeln(x3:0:10, ' - третий корень');
  347.  
  348. //    writeln(Integral(@Func1, x1, x3, 0.001));
  349. //    writeln(Integral(@Func2, x2, x3, 0.001));
  350. //    writeln(Integral(@Func3, x1, x2, 0.001));
  351.  
  352.    i1 := Integral(@Func1, x1, x3, eps2);
  353.    i2 := Integral(@Func2, x2, x3, eps2);
  354.    i3 := Integral(@Func3, x1, x2, eps2);
  355.  
  356.    {площадь криволинейного треугольника}
  357.    i := i1 - i2 - i3;
  358.  
  359.    writeln(i:0:10, ' - площадь криволинейного треугольника');
  360.    Graph(@Func1, @Func2, @Func3, x1, x2, x3);
  361. end.
  362.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement