Лабораторная работа № 3
Построение таблицы значений и графика функции
Цель занятия – ознакомление и приобретение навыков построения таблиц значений и графиков функций, заданных аналитическим выражением.
1. Построение таблицы значений функции
1.1. Общие сведения
Задачи анализа различных статических характеристик электронных схем, электрических цепей и других часто возникают в инженерной практике. К построению таблицы значений функций, заданных громоздкими аналитическими выражениями или составными формулами, прибегают в тех случаях, когда требуется выяснить качественное поведение функции при изменении аргумента в некоторых пределах, выявить области, где функция обращается в ноль, минимальные и максимальные значения, области убывания и возрастания. Применение аналитических методов анализа функций может быть затруднено из-за громоздкости выражения функции или не дифференцируемости. Поэтому самый простой способ выявить характер изменения функции при изменении ее аргумента – это построить таблицу значений функции. Далее полученные значения можно использовать для построения графика функции, выбора интервала, где функция обращается в ноль и т.д.
1.2. Постановка задачи
Известно, что важной характеристикой полевого транзистора, представляющей его свойства, является стоко-затворная вольт-амперная характеристика. Для нее имеется следующая зависимость тока Ic от напряжения между затвором и стоком Uz:
Ic=Icmax(1‑Uz/U0)2, где Icmax – максимальны ток стока при Uz=0, U0 – напряжение отсечки.
Итак, требуется для заданной зависимости Ic=Icmax(1‑x/U0)2построить таблицу значений функции Ic при изменении аргумента x=Uz в диапазоне от a до b с заданным шагом h.
1.3. Алгоритм
Ввод исходных данных: вид и параметры U0, Icmax функции, границы отрезка [a, b], шаг его разбиения h.
Задание начального значения аргумента x=Uz=a;
Вычисление значения функции Ic в точке x и вывод на экран дисплея;
Увеличение значения аргумента x=x+h;
Проверка условия x<b. Если оно выполняется, то переход к п.3 алгоритма, в противном случае – останов.
1.4. Реализация алгоритма в C++ Builder
После запуска C++ Builder и открытия окна формы (модуль Form1) разместим в нем следующие объекты вкладки стандарт панели визуальных компонент:
поля редактирования Edit1 – Edit5 для ввода исходных данных: значений левой a и правой b границ интервала, шага h изменения аргумента функции, значения параметров U0, Icmax функции;
метки Label1 – Label13 для вывода заголовков и пояснений;
кнопки Button1 – Button3 для управления работой программы;
таблицу (объект StringGrid вкладки Additional панели визуальных компонент) для размещения и вывода результата.
С помощью инспектора объектов (Object Inspector) определяются заголовки для объектов Form1, Label1 – Label7 путем ввода соответствующего текста в поле Caption вкладки Properties. Например, для окна Form1 в поле Caption вводится текст "Таблица значений функции Ic=Icmax(1-Uz/Uo)^2"; для метки Label1 – текст "Исходные данные", для метки Label2 – текст "a – левая граница" и т.д.
Графический элемент StringGrid предназначен для представления табличных данных. Он имеет следующие свойства: Name – имя объекта, ColCount – количество столбцов в таблице, FixedCols – количество зафиксированных столбцов, RowCount – количество строк в таблице, FixedRows – количество зафиксированных строк, Cells[col][row] – содержимое ячейки таблицы на пересечении столбца с номером col и строки с номером row (нумерация производится с нулевого значения). Определим с помощью инспектора объектов следующие свойства StringGrid: Name = Tab1, ColCount = 2, FixedCols = 0, FixedRows = 1, RowCount = 2.
Общий вид окна формы с выбранными компонентами представлен на Рис.3.1.
Рис.3.1. Окно формы для построения таблицы значений функции Ic=Icmax(1‑Uz/U0)2
Для управления работой программы с каждой кнопкой связывается событие "щелкнуть" (Click). При щелчке на кнопке Button1 программа должна ввести исходные данные – значения a, b, h, Icmax, U0. Для хранения данных в раздел private класса формы TForm1 (файл Unit1.h) добавляются свойства a, b, h, x, Icmax, U0 вещественного типа и M целого типа (отвечает за количество полученных значений функции). Массив вещественных чисел Y[200] служит для хранения вычисленных значений функции f(x). Затем после двойного щелчка кнопки Button1 и попадания в окно редактора кода вводятся следующие операторы присваивания:
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
h = StrToFloat(Edit3->Text);
Icmax = StrToFloat(Edit4->Text);
U0 = StrToFloat(Edit5->Text);
Здесь стандартная функция StrToFloat преобразует символьные представления значения поля Text объектов Edit1 – Edit5 в соответствующие вещественные значения.
Для вычисления функции f(x) в раздел public класса TForm1 в файле Unit1.h введем метод
float f(float x) { /* Определение функции f(x) */
float r = 1-x/U0;
return Icmax*r*r;
}
Далее после двойного щелчка кнопки Button2 и попадания снова в окно редактора кода вводятся операторы, реализующие алгоритм вычисления значения функции и их вывод в таблицу Tab1. При этом сначала в ячейки Cells[0][0] и Cells[1][0] таблицы Tab1 заносятся обозначения колонок "x" и "f(x)" соответственно. Затем в цикле для каждого нового значения аргумента x вычисляются значения функции f(x). Эти значения преобразуются в символьное представление с помощью стандартной функции FloatToStr и выводятся в ячейки 0-й строки (0-я и 1-я колонки) таблицы Tab1. Заметим, что для обращения к ячейкам таблицы используется запись Tab1->Cells[0][i], в которой Tab1 есть название таблицы, Cells[0][i] – ячейка таблицы, находящаяся на пересечении 0-й колонки и i-й строки.
Аналогично после двойного щелчка кнопки Button3 и попадания в окно редактора кода вводится оператор вызова метода Close(), завершающего работу программы. В результате программа будет иметь следующий вид:
Файл Unit1.h
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <ExtCtrls.hpp>
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TEdit *Edit5;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TStringGrid *Tab1;
TImage *Image1;
TButton *Button4;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
private: // User declarations
float a,b,h,x,Icmax,U0;
int M;
float Y[200];
public: // User declarations
__fastcall TForm1(TComponent* Owner);
float f(float x) { /* Определение функции f(x) */
float r = 1-x/U0;
return Icmax*r*r;
}
};
extern PACKAGE TForm1 *Form1;
#endif
Файл Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
h = StrToFloat(Edit3->Text);
Icmax = StrToFloat(Edit4->Text);
U0 = StrToFloat(Edit5->Text);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i;
/* Вычисление значений функции и построение таблицы */
M = (b-a)/h + 1; /* Определение количества точек */
Tab1->RowCount = M + 1; /* Задание числа строк в таблице */
Tab1->Cells[0][0] = " x";
Tab1->Cells[1][0] = " f(x)";
i=0; x = a;
while(x<=b) {
Y[i] = f(x);
Tab1->Cells[0][i+1]=FloatToStr(x); /* вывод в SttringGrid */
Tab1->Cells[1][i+1]=FloatToStr(Y[i]); /* сохраняем в массиве Y */
x = x+h;
i++;
}
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close();
}