Контрольный расчет в wxMaxima, тестирование программы
Оглавление
Оглавление. 2
Постановка задачи. 3
Таблица идентификаторов. 4
Общая блок-схема алгоритма: 5
Алгоритм формирования time: 6
Алгоритм формирования Uvh: 6
Алгоритм формирования Uvih: 7
Алгоритм вывода time, Uvh, Uvih на экран: 7
Алгоритм вычисления параметра без точности: 8
Алгоритм вычисления параметра с заданной точностью: 9
Текст программы.. 10
Контрольный расчет в wxMaxima, тестирование программы. 14
Лист для подписанных расчетов. 17
Вывод. 18
Постановка задачи
Дана линейная электрическая сеть, на выходе которой действует сигнал Uвхода. Цепь преобразует входной сигнал в соответствии с передаточной характеристикой Uвыхода. Необходимо написать программу, формирующую массивы Uвхода и Uвыхода, записать эти массивы во внешние текстовые файлы, вычислить параметр W с погрешностью E= 0,01.
a (t-t) при t <=t1
Uвх(t)=
a (t1-tнач) – b(t-t1) при t1 < t <= t2
a (t1-t)-b(t2-t1)-c(t-t2) при t >t2
a=20В/с
b=0,5В/с
c=17В/с
tнач=10с
tкон=50с
t1=15с
t2=45с
a Uвх1 + b при Uвх<=Uвх1
Uвых(t)=
a Uвх + b при Uвх1 < Uвх <= Uвх2
a Uвх2 + b при Uвх > Uвх2
a=2.5I/B
b=10B
Uвх1=10B
Uвх2=30B
P - момент времени в который Uвыхода становится больше 50.
Таблица идентификаторов
Обозначение в задачи | Идентификатор | Переменная | Константа | Глобальная | Локальная | Подпрограмма | Назначение |
a | a | + | + | Uvh11, Uvich1 | Начальные данные | ||
b | b | + | + | Uvh11, Uvich1 | Начальные данные | ||
c | c | + | + | Uvh11, Uvich1 | Начальные данные | ||
tнач | tn | + | + | time1, Uvh11 | Начальное время | ||
tкон | tk | + | + | time1, Uvh11 | Конечное время | ||
t1 | t1 | + | + | Uvh11 | Начальные данные | ||
t2 | t2 | + | + | Uvh11 | Начальные данные | ||
Uвх1 | Uvh1 | + | + | Uvich1 | Начальные данные | ||
Uвх2 | Uvh2 | + | + | Uvich1 | Начальные данные | ||
t | time | + | + | time1, Uvh11, zapis, param_t | Начальные данные | ||
Uвх(t) | Uvh | + | + | Uvh11, Uvich1, output, zapis, param_t | Входной массив | ||
Uвых(t) | Uvich | + | + | Uvich1, output, zapis, param_t | Выходной массив | ||
i | + | + | output, Uvich1, Uvh11, time1, zapis | Счетчик цикла | |||
fp | + | + | zapis | Указатель на поток | |||
NMAX | + | + | Размерность массивов | ||||
p | + | + | param | Параметр |
Общая блок-схема алгоритма:
Алгоритм формирования time:
Алгоритм формирования Uvh:
| |||||||||
Алгоритм формирования Uvih:
| |||||||||||
| |||||||||||
| |||
Алгоритм вывода time, Uvh, Uvih на экран:
Алгоритм вычисления параметра без точности:
| |||||
Алгоритм вычисления параметра с заданной точностью:
Текст программы
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define NMAX 3000
char zastavka()
{
FILE *fp;
fp=fopen("zastavka.txt","r");
if(fp==NULL)
{
printf("\nFile ne otkryt\n");
exit(1);
}
char str[80];
while(fgets(str,81,fp)!=NULL)
{
puts(str);
}
fclose(fp);
}
int zapis(float t[],float Uvh[],float Uvih[],int N)
{
int i;
FILE *fp;
fp=fopen("time.txt","w");
if(fp==NULL)
{
printf("\nFile ne otkryt\n");
exit(1);
}
for(i=0;i<N;i++)
{
fprintf(fp,"\n%f",t[i]);
}
fclose(fp);
fp=fopen("Uvh.txt","w");
if(fp==NULL)
{
printf("\nFile ne otkryt\n");
exit(1);
}
for(i=0;i<N;i++)
{
fprintf(fp,"\n%f",Uvh[i]);
}
fclose(fp);
fp=fopen("Uvih.txt","w");
if(fp==NULL)
{
printf("\nFile ne otkryt\n");
exit(1);
}
for(i=0;i<N;i++)
{
fprintf(fp,"\n%f",Uvih[i]);
}
fclose(fp);
}
void time1(int N, float time[], float tn, float tk)
{ float dt=(tk-tn)/(N-1);
for(int i=0; i<N; i++)
time[i]=tn+i*dt;
}
void Uvh11(int N, float time[],float Uvh[],float a,float b,float c,float t1,float t2,float tn,float tk)
{ for(int i=0;i<N;i++){
if(time [i]<t1)
Uvh[i]=a*(time[i]-tn);
else if(time[i]>t2)
Uvh[i]=a*(t1-tn)-b*(t2-t1)-c*(time[i]-t2);
else Uvh[i]=a*(t1-tn)-b*(time[i]-t1);
}
}
void Uvich1(float Uvich[],int N, float Uvh[],float a,float b,float Uvh1,float Uvh2)
{
for(int i=0; i<N;i++){
if(Uvh[i]<=Uvh1)
Uvich[i]=a*Uvh1+b;
else if(Uvh[i]>Uvh2)
Uvich[i]=a*Uvh2+b;
else Uvich[i]=a*Uvh[i]+b;
}
}
void output(int N, float time[], float Uvh[],float Uvih[]){
printf("%10s%10s%10s","t","Uvh","Uvih");
for(int i=0; i<N; i++)
printf("\n%10.2f%10.2f%10.2f", time[i],Uvh[i],Uvih[i]);
}
float param(float *mas,int Z,int N,float tn,float tk)
{
int i;
float dt,p=tn;
dt=(tk-tn)/(N-1);
for (i=0;i<N;i++){
if (mas[i]>Z) {p=p+dt*i;
break;}
}
return p;
}
float param_t(float time[],float Uvh[], float Uvih[], int N)
{
int i;
int Nmax=200;
float a=20, b=0.5, c=17, tn=10, tk=50, t1=15, t2=45, Uvh1=10, Uvh2=30;
float p1=0,p2=0,p3=0,p4=0,d;
time1 (N, time , tn, tk);
Uvh11 (N,time,Uvh,a, b, c, t1, t2,tn, tk);
Uvich1 (Uvih,N,Uvh,2.5, 10, Uvh1, Uvh2);
p1=param(Uvih,50,N,tn,tk);
metka: N=N+1;
time1 (N, time , tn, tk);
Uvh11 (N,time,Uvh,a, b, c, t1, t2,tn, tk);
Uvich1 (Uvih,N,Uvh,2.5, 10, Uvh1, Uvh2);
p2=0;
if(N<Nmax){
p2=param(Uvih,50,N,tn,tk);
d=fabs((p2-p1)/p2);
if(d<=0.01)
printf("Tochnost=%4.3f\nN=%d\nVremya parametra Uvih=%3.3f\n",d,N,p2);
else {
p1=p2;
goto metka;}}
else printf("\nN>Nmax\n");
}
int main(void)
{
float time[NMAX], Uvh [NMAX], Uvich[NMAX];
float a=20, b=0.5, c=17, tn=10, tk=50, t1=15, t2=45, Uvh1=10, Uvh2=30;
int N=20;
char p;
printf("Viberite komandu:\n1 - zastavka\n2 - massivi\n3 - parametr\n4 - vihod\n");
for(int i=0;i<N;i++){
scanf("%c",&p);
switch(p)
{
case '1': {
zastavka();
break;
}
case '2': {
time1 (N, time , tn, tk);
Uvh11 (N,time,Uvh,a, b, c, t1, t2,tn, tk);
a=2.5;
b=10;
Uvich1 (Uvich,N,Uvh,a, b, Uvh1, Uvh2);
output(N, time,Uvh,Uvich);
zapis(time,Uvh,Uvich,100);
break;
}
case '3': {
param_t(time,Uvh,Uvich,10);
break;
}
case '4': {
exit(1);
break;
}
}}
return(0);}
Контрольный расчет в wxMaxima, тестирование программы.
(%i1) a:20;
b:0.5;
c:17;
tn:10;
tk:50;
t1:15;
t2:45;
n:20;
Uvh1:10;
Uvh2:30;
a1:2.5;
b1:10;
(%i13) s:(tk-tn)/(n-1),numer;
(%i14) Uvh(t):=if t<=t1 then a*(t-tn) else if t>t2 then a*(t1-tn)-b*(t2-t1)-c*(t-t2) else a*(t1-tn)-b*(t-t1);
(%i15) for t:tn thru tk+s/10 step s do display(Uvh(t)),numer;
(%i16) wxplot2d([Uvh(t)], [t,tn,tk])$
(%i17) Uvih(t):=if Uvh(t)<=Uvh1 then a1*Uvh1+b1 else if Uvh2<="" span="">
(%i18) for t:tn thru tk+s/10 step s do display(Uvih(t)),numer;
(%i19) wxplot2d([Uvih(t)], [t,tn,tk])$