Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Задачи По Информатике (Попов Д. И

.).doc
Скачиваний:
12
Добавлен:
07.10.2014
Размер:
133.12 Кб
Скачать

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

Написать процедуру 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. Проверяем текущую позицию на экране на условия:

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

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

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

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

  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 <= 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.

Задание на лабораторную работу

  1. Написать и отладить программу интегрирования функций F1 и F2 (по вариантам) с помощью метода трапеций.

  2. Написать и отладить программу вывода на экран консоли графиков функций.

  3. Модифицировать процедуру DrawUserFunc таким образом, чтобы на экран выводилось одновременно два графика функций f1 и f2 (по вариантам).

  4. Модифицировать процедуру DrawUserFunc так чтобы в первом столбце выводились значения по оси Oy, а в последней строке – значения по оси Ox.

  5. Подобрать параметры вывода двух графиков на экран так, чтобы были видны точки пересечения двух графиков – корень уравнения 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)