Код программы
Исходный файл “CourseWork.Cpp”
#include "Functions.h"
extern "C++"
{
}
int main(void)
{
vector<float> t, Uvx, Uvix; // vector of time, U_inner, U_outer
t.resize(N); Uvx.resize(N); Uvix.resize(N);
float tn = 10, tk = 80, af; // start and final point for time
double dt;
int16 n; // int_least16_t was defined as int16 at Function.h file
int_least8_t counter = 0;
int choose = 0;
Title();
while (true)
{
cout << "========================================================MENU============================================================" << endl;
cout << "1. Solve for N" << endl;
cout << "2. Solution with a given precision" << endl;
cout << "3. Write to file" << endl;
cout << "4. Build graph" << endl;
cin >> choose;
switch (choose)
{
case 1:
cout << "Enter the desired number of points: ";
cin >> n;
dt = (tk - tn) / (n - 1);
AppendToTime(n, dt, tn, t);
U_in(n, t, Uvx);
U_out(n, Uvx, Uvix);
PrintTable(n, t, Uvx, Uvix);
break;
case 2:
cout << "parametr for Uvx" << endl;
findParam(t, Uvx, Uvix, dt, tn);
cout << "Parametr for Uvix" << endl;
findParam2(t, Uvx, Uvix, dt, tn);
break;
case 3:
VectorToFile(t, "TimeArray.txt", n);
VectorToFile(Uvx, "Uvx_Array.txt", n);
VectorToFile(Uvix, "Uvix_Array.txt", n);
counter += 1;
break;
case 4:
if (counter >= 1)
{
BuildGraph();
}
else
{
cout << "You need to write values into file first" << endl;
}
}
cout << "Want to continue your work?" << endl;
cout << "0.No" << endl << "1.Yes" << endl;
cin >> choose;
switch (choose)
{
case 0:
cout << "Bue!" << endl;
return 0;
break;
case 1:
choose = 0;
continue;
}
}
}
Файл “Functions.Cpp”
#include "Functions.h"
#pragma region lists and table
void AppendToTime(int16 n, double dt, float tn, vector<float>& t)
{
// Formation of an array of time
t.resize(n);
for (int i = 0; i < n; i++)
{
t[i] = tn + (i - 1) * dt;
}
}
void U_in(int16 n, vector<float>& t, vector<float>& Uvx)
{
// Formation of the input voltage array
constexpr float t1 = 20, t2 = 60, t3 = 70, tk = 80, U = 50;
for (int i = 0; i < n; i++)
{
if (t[i] <= t1)
{
Uvx[i] = 0;
}
else if (t[i] <= t2)
{
Uvx[i] = ((t[i] - t1) * (U - 0)) / (t2 - t1) + 0;
}
else if (t[i] <= t3)
{
Uvx[i] = U;
}
else
{
//Uvx[i] = ((Uvx[i] - t3) * (U - 0))/(t3 - tk) + U;
Uvx[i] = ((t[i] - t3) * (U - 0)) / (t3 - tk) + U;
}
}
}
void U_out(int16 n, vector<float>& Uvx, vector<float>& Uvix)
{
// forming an array of output voltage
constexpr float a1 = 0.5, b1 = 10, a2 = 2.5, b2 = 10, a3 = 0.5, b3 = 60, Uvx1 = 10, Uvx2 = 30;
for (int i = 0; i < n; i++)
{
if (Uvx[i] < Uvx1)
{
Uvix[i] = a1 * Uvx[i] + b1;
}
else if (Uvx[i] > Uvx1 && Uvx[i] < Uvx2)
{
Uvix[i] = a2 * Uvx[i] + b2;
}
else
Uvix[i] = a3 * Uvx[i] + b3;
}
}
void PrintTable(int16 n, vector<float>& t, vector<float>& Uvx, vector<float>& Uvix)
{
//Print results in table
cout << "# t Uvx Uvix" << endl;
for (int i = 1; i < n; i++)
{
printf("%d %6.3f %6.3f %6.3f\n", i, t[i], Uvx[i], Uvix[i]);
}
}
void Title(void)
{
// Shows title from file on the screen
ifstream file("Zast.txt");
if (file.is_open())
{
file.seekg(3, ios::beg);
string reader;
while (!file.eof())
{
while (getline(file, reader))
{
cout << reader;
}
file.close();
}
cout << "\n\n";
}
else
{
fprintf(stderr, "[ERROR] file doesn't exist or corrupted\n\n");
}
}
void VectorToFile(vector<float> vector_file, string name, int n)
{
// Write vector values to file function
ofstream file(name);
if (file.is_open())
{
for (int i = 1; i < n; i++)
{
file << vector_file[i] << endl;
}
cout << "[INFO] File " << name << " " << "write successfully" << endl;
file.close();
}
else
{
fprintf(stderr, "[ERROR] file wasn't created\n");
}
}
#pragma endregion
#pragma region Parametr
void findParam(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn)
{
int N1 = 61;
AppendToTime(N1, dt, tn, t);
U_in(N1, t, Uvx);
U_out(N1, Uvx, Uvix);
double dUimp = 1000, eps = 0.01, prev = ImpulseDuration(Uvx, dt, N1);
double delta = 0;
while (dUimp > eps && N1 < N)
{
N1 *= 2;
dt = (80 - 10) / (N1 - 1.0);
AppendToTime(N1, dt, tn, t);
Uvx.resize(N1);
U_in(N1, t, Uvx);
Uvix.resize(N1);
U_out(N1, Uvx, Uvix);
delta = ImpulseDuration(Uvx, dt, N1);
dUimp = fabs(prev - delta) / (prev);
prev = delta;
cout << "Parametr = " << delta << "|" << "accuracy = " << dUimp << "|" << "points =" << N1 << endl;
}
if (N1 > N)
{
cout << "Target accuracy was not achieved" << endl;
}
else
{
cout << "Target accuracy was achived with n = " << N1 << " " << "accuracy is: " << dUimp << endl;
cout << "Impulse duration is: " << delta << endl;
}
}
void findParam2(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn)
{
int N1 = 61;
AppendToTime(N1, dt, tn, t);
U_in(N1, t, Uvx);
U_out(N1, Uvx, Uvix);
double dUimp = 1000, eps = 0.01, prev = ImpulseDuration(Uvx, dt, N1);
double delta = 0;
while (dUimp > eps && N1 < N)
{
N1 *= 2;
dt = (80 - 10) / (N1 - 1.0);
AppendToTime(N1, dt, tn, t);
Uvx.resize(N1);
U_in(N1, t, Uvx);
Uvix.resize(N1);
U_out(N1, Uvx, Uvix);
delta = ImpulseDuration(Uvix, dt, N1);
dUimp = fabs(prev - delta) / (prev);
prev = delta;
cout << "Parametr = " << delta << "|" << "accuracy = " << dUimp << "|" << "points =" << N1 << endl;
}
if (N1 > N)
{
cout << "Target accuracy was not achieved" << endl;
}
else
{
cout << "Target accuracy was achived with n = " << N1 << " " << "accuracy is: " << dUimp << endl;
cout << "Impulse duration is: " << delta << endl;
}
}
double ImpulseDuration(vector<float> signal, double dt, int16 n)
{
double Umax = 0, Umin = 99999, Uimp;
double delta = 0;
for (int i = 1; i < n; i++)
{
if (signal[i] > Umax)
{
Umax = signal[i];
}
}
for (int i = 1; i < n; i++)
{
if (signal[i] < Umin)
{
Umin = signal[i];
}
}
Uimp = Umin + 0.5 * (Umax - Umin);
if (Umin == 0)
{
delta = 0;
for (int i = 0; i < n; i++)
if (signal[i] >= 0.5 * Umax)
delta += dt;
}
else
{
delta = 0;
for (int i = 0; i < n; i++)
if (signal[i] >= Uimp)
delta += dt;
}
return delta;
}
#pragma endregion
void BuildGraph()
{
system("C:\\maxima-5.43.2\\wxMaxima\\wxmaxima.exe graph.wxmx");
}