Задачи По Информатике (Попов Д. И
.).docЗадача построения графика функции.
Написать процедуру DrawUserFunc (x1,x2,y1,y2:Real; Func: FuncToDraw), которая с помощью стандартной процедуры вывода Write выводит экран консоли размером MX=80 символов и MY=25 строк график функции Func на интервале [x1,x2] со значениями в диапазоне [y1,y2]. Для вычисления произвольной функции определить пользовательский тип FuncToDraw.
Решение.
Анализ требований и формальная постановка задачи.
Нужно построить график функции Func(x) и отобразить его на экране консоли. Для этого нужно пересчитать координаты исходной функции в заданном диапазоне в целочисленные координаты позиций на экране.
Для отображения графика на экране консоли будем пользоваться следующим символами:
-
Символ ‘*‘ – если в этой позиции экрана y = f(x).
-
Символ ‘-‘ – если в этой позиции экрана y ≠ f(x) и y=0 (ось абсцисс).
-
Символ ‘|’ – если в этой позиции экрана y ≠ f(x) и x=0 (ось ординат).
-
Символ ‘ ‘ (пробел) – во всех остальных случаях.
Выбор и разработка математической модели.
Определимся с преобразованием координат. По условию функцию нужно отобразить в прямоугольнике со следующими координатами: (x1,y1) – (x2,y2) – система координат К1.
На текстовой консоли имеется прямоугольник размером MX на MY символов. Т.е. мы имеем прямоугольник с координатами (1,1) – (MX, MY) – система координат К2. Причем значения координат – целые числа в диапазонах 1.. MX по оси Х и 1..MY по оси Y.
Согласно правилам преобразования координат, чтобы найти координату Xс системы К1 на основе соответствующей ей координаты Xэ (Х на экране) в системе К2 нужно составить пропорции по размерам соответствующих систем координат, и из этой пропорции найти зависимость. В нашем случае пропорция следующая:
. Откуда , (1)
или (2)
Аналогично составляем пропорцию для пересчета по оси ординат координаты Yc системы К1 в координату Yэ (Y на экране) системы К2. Заметим, что в координатной системе К2 отсчет идет из левого верхнего угла экрана, т.е. координата левой верхней точки экрана равна (1,1). А правой нижней – (MX, MY). Получаем пропорцию
, откуда (3)
Для определения позиций осей ординат и абсцисс в выражении (2) нужно положить XC = 0, а в выражении (3) – YC = 0. Получаем следующие уравнения для осей:
Для оси ординат (4)
Для оси абсцисс (5)
Разработка алгоритма
Составим словесное описание алгоритма
-
Выбираем каждую позицию на экране, начиная с левого верхнего угла, и двигаемся сначала по строке вправо, потом переходим к следующей строке.
-
Для текущей позиции делаем преобразование из К2 в К1 и вычисляем значение функции.
-
Проверяем текущую позицию на экране на условия:
-
Если в этой позиции y = f(x), то выводим ‘*‘
-
Если в этой позиции y ≠ f(x) и y=0 (ось абсцисс), то выводим ‘-‘
-
Если в этой позиции y ≠ f(x) и x=0 (ось ординат), то выводим ‘|’
-
Во всех остальных случаях выводим ‘ ‘ (пробел)
-
-
Переходим к следующей позиции на экране.
Разработаем блок-схему алгоритма
Н апишем программу
program DrawFunc;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
const
MAX_X=80;
MAX_Y=25;
type
FuncToDraw = function (x:real):real;
function func1(x:real):real;
begin
func1:=(sin(x));
end;
function func2(x:real):real;
begin
func2:=arctan(x);
end;
function func3(x:real):real;
begin
func3:=x*x;
end;
procedure DrawUserFunc(x1,x2,y1,y2:real; Func: FuncToDraw);
var x,y:integer;
f,xcur :real;
begin
for y:=1 to MAX_Y do begin
for x:=1 to MAX_X do begin
//вычислить текущую координату по ф-ле (1)
xcur:=x1+(x-1)*(x2-x1)/(MAX_X-1);
f:= Func(xcur); //вычислить значение функции в текущей позиции
// проверяем условие (3) -
//Текущая точка экрана (X,Y) соответствует значению функции?
if y = MAX_Y-round((MAX_Y-1)*(f-y1)/(y2-y1)) then write ('*')
else //ось ординат?
if x = 1 - round(x1 * (MAX_X-1) / (x2-x1)) then write ('|')
else //ось абсцисс?
if y = MAX_Y + round(y1 * (MAX_Y-1)/(y2-y1)) then write ('-')
else write (' ');
end;
end;
end;
begin
DrawUserFunc(-3,3,-1,1,func1); readln;
DrawUserFunc(-4,4,-1.3,1.3,func2); readln;
DrawUserFunc(-4,4,0,9,func3); readln;
end.
Задача численного интегрирования функции.
Необходимо написать программу интегрирования на интервале [A, B] двух функций f1(x) = x/(x - 1) и f2(x) = cos(x)/x методом трапеций, используя формальные параметры-функции.
Решение
Type
Func=function (x:real):real;
Var
A,B: real;
N: integer;
{$F+}
function F1(x:real):real;
begin F1:=x/(x-1); end;
function F2(x:real):real;
begin F2:=cos(x)/x; end;
{$F-}
Function Integral ( A,B:Real; N:integer; F:Func):real;
{ A,B — пределы интегрирования, N — количество интервалов, F — интегрируемая функция }
var
S,X,H:real;
Begin
H:= (B-A)/N;// Н — шаг интегрирования
S:=(F(A)+F(B))/2; X:=A+H;
While x <= B do
Begin
S:= S + F(x); x:=x+H;
End;
Result:=S*H;
End;
Begin
Write(‘Введите A,B,N’); Readln(A,B,N);
Writeln (‘Интеграл F1 = ’, Integral(A,B,N, F1));
Writeln (‘Интеграл F2 = ’, Integral(A,B,N, F2));
End.
Задание на лабораторную работу
-
Написать и отладить программу интегрирования функций F1 и F2 (по вариантам) с помощью метода трапеций.
-
Написать и отладить программу вывода на экран консоли графиков функций.
-
Модифицировать процедуру DrawUserFunc таким образом, чтобы на экран выводилось одновременно два графика функций f1 и f2 (по вариантам).
-
Модифицировать процедуру DrawUserFunc так чтобы в первом столбце выводились значения по оси Oy, а в последней строке – значения по оси Ox.
-
Подобрать параметры вывода двух графиков на экран так, чтобы были видны точки пересечения двух графиков – корень уравнения f1=f2. Указать значение корня с точностью до 2 десятичных знаков.
Варианты заданий
-
№ варианта
F1
F2
Exp(2/x*x)
Abs(Sin(x)+cos(x))
Sin(x)-cos(x)
Ln(1/(1-2exp(x*x))
Tan(2x)/x
Sqrt(abs(2x*x-4x-5))
2X^3+4x^2-6x-12
Abs(2X^3+4x^2-6x-12 )
1/(x^3-4x-5)
Abs(X^2*Sin(x))
Ln(X^3+2x^2-4)
Abs(X^3*cos(x))
3+1/x
Sin(abs(x^2-x)+3)
Sin(2x+3)+cos(3x)
3abs(x)-1
Sin(4x-1)-cos(2x)
5exp(4/(3x^2-2x))
3Ln(2x)
-4abs(x)+1
-Ln(3x)
5abs(x)-4
Sin(x*x+x-4)+cos(x)
Abs(3x-1)
Sin(x*x)+cos(x^3)
Abs(-2x+5)
Sqrt(x*x-2)
2Exp(1/x*x)
0,25x*x-abs(x)-3
Abs(2Ln(3x))
Abs(Sin(3x)+2cos(x))
1/x
Abs(2Sin(x)-cos(3x))
Arctan(x*x-2x+3)
Abs(Tan(abs(x))/x)
Sin(4x-1)-cos(2x)
Abs(2X^3-abs(6x)-12 )
-4Ln(3x)+exp(x)
Abs(2X^2*Sin(3x))
-3Ln(2x)
Abs(3X^3*cos(2x))
Sin(x*x+x-4)+cos(x)
Abs(5/x^2)
Sin(x*x)+cos(x^3)
6abs(x)-2
Abs(Sqrt(x*x-2))
-3abs(x)+4
0,25x*x-abs(x)-3
-5abs(x)+2
1/(x^2+x-4)
4abs(x)-1
Artan(2x^2-3abs(x)+2)
Abs(3x-1)
3Exp(1/x)
Ln(sin(x))
Arctan(3x+4)