Всё для Учёбы — студенческий файлообменник
1 монета
doc

Расчётная «Построение графика функции» по Информатике (Попов Д. И.)

Задача построения графика функции.

Написать процедуру DrawUserFunc (x1,x2,y1,y2:Real; Func: FuncToDraw), которая с помощью стандартной процедуры вывода Write выводит экран консоли размером MX=80 символов и MY=25 строк график функции Func на интервале [x1,x2] со значениями в диапазоне [y1,y2]. Для вычисления произвольной функции определить пользовательский тип FuncToDraw.

Решение. Анализ требований и формальная постановка задачи.

Нужно построить график функции Func(x) и отобразить его на экране консоли. Для этого нужно пересчитать координаты исходной функции в заданном диапазоне в целочисленные координаты позиций на экране.

Для отображения графика на экране консоли будем пользоваться следующим символами:

1. Символ ‘*‘ – если в этой позиции экрана y = f(x).

2. Символ ‘-‘ – если в этой позиции экрана y ≠ f(x) и y=0 (ось абсцисс).

3. Символ ‘|’ – если в этой позиции экрана y ≠ f(x) и x=0 (ось ординат).

4. Символ ‘ ‘ (пробел) – во всех остальных случаях.

Выбор и разработка математической модели.

Определимся с преобразованием координат. По условию функцию нужно отобразить в прямоугольнике со следующими координатами: (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)

Разработка алгоритма

Составим словесное описание алгоритма

1. Выбираем каждую позицию на экране, начиная с левого верхнего угла, и двигаемся сначала по строке вправо, потом переходим к следующей строке.

2. Для текущей позиции делаем преобразование из К2 в К1 и вычисляем значение функции.

3. Проверяем текущую позицию на экране на условия:

a. Если в этой позиции y = f(x), то выводим ‘*‘

b. Если в этой позиции y ≠ f(x) и y=0 (ось абсцисс), то выводим ‘-‘

c. Если в этой позиции y ≠ f(x) и x=0 (ось ординат), то выводим ‘|’

d. Во всех остальных случаях выводим ‘ ‘ (пробел)

4. Переходим к следующей позиции на экране.

Разработаем блок-схему алгоритма

Напишем программу

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

Показать полностью…
Похожие документы в приложении