# ===================================================================================== 1; tr=pi/180; tg=180/pi; a=e^(j*120*tr); # Counters global SECTION = 0 global SUBSECTION = 0 global SUBSUBSECTION = 0 # Функция выводит на экран комплексное число в радиальной форме # ex.: printc("Z11", Z11) function printc(s,a) printf("%s = %ge^(%gj)\n",s,abs(a),arg(a)*180/pi); endfunction function myprint(s,m,a) printf("%s = %ge^%gj\n",s,m,a); endfunction # Функция печатает функцию тока и напряжения по их комплексному значению # s - строка # cpl - комплексное значение тока/напряжения # n - номер гармоники function printi(s,cpl,n) tg=180/pi; tr=pi/180; if(arg(cpl)<0) add_str = ""; else add_str = "+"; endif printf("\t %s(t) = sqrt(2) %g sin(%dwt%s%g)\n",s,abs(cpl),n,add_str,arg(cpl)*tg); endfunction # Функция печатает функцию тока и напряжения при нессиметрии, выводит 1, 3 и 5 гармоники # s - строка # i1 - ток/напряжение 1й гармоники # i2 - ток/напряжение 2й гармоники # i3 - ток/напряжение 3й гармоники function printn(s,i1,i3,i5) tg=180/pi; tr=pi/180; if(arg(i1)<0) add_str1 = ""; else add_str1 = "+"; endif if(arg(i3)<0) add_str3 = ""; else add_str3 = "+"; endif if(arg(i5)<0) add_str5 = ""; else add_str5 = "+"; endif printf(" %s(t) = %g 2sin(wt%s%g) + %g 2sin(3wt%s%g) + %g 2sin(5wt%s%g)\n", s,abs(i1),add_str1,arg(i1)*tg, abs(i3),add_str3,arg(i3)*tg, abs(i5),add_str5,arg(i5)*tg); endfunction # Отрисовываем график, x,y - массивы с координатами function mydraw(x,y) #graw("reset;"); clearplot; gset grid; #gset title "ea(t) = 220 2sin(wt) + 110 2sin(3*wt+100) + 60 2sin(5*wt-20)"; #gset title "tit"; gset xlabel "t" gset ylabel "cosf" gset key top left; #gset xrange [0:]; #gset yrange [0:]; gset smooth csplines; hold on; plot(x,y,"1;;"); hold off; gset terminal postscript; gset output "out.eps"; replot; gset terminal x11; gset output; pause -1; endfunction # Отрисовываем график, x,y - массивы с координатами function mydraw_new(x,y, tit, xlab, ylab) clearplot; grid("on"); title(tit); xlabel(xlab); ylabel(ylab); #gset key top left; #gset smooth csplines; __gnuplot_set__ key top left; __gnuplot_set__ smooth csplines; hold on; plot(x,y,"1;;"); hold off; __gnuplot_set__ terminal postscript; __gnuplot_set__ output "out.eps"; replot; __gnuplot_set__ terminal x11; __gnuplot_set__ output; pause -1; endfunction # Рисуем векторную диаграмму # @param - стуктура с полями: offset - начало, с которого рисуется вектор # arg - вектор в комплексной форме # label - метка для вектора, поля меток разделяются ';' # @tit - заголовок рисунка # # Ex.: draw_data = struct("offset", [0,0,0], # "arg", [Ila, Ilb, Ilc], # "label", ["Ila"; "Ilb"; "Ilc"]); # draw_vector(draw_data, "TEST") function draw_vector(param, tit) clearplot; grid("on"); title(tit); xlabel("+1"); ylabel("+j"); __gnuplot_set__ key top left; hold on; r=columns(param.arg); col=columns(param.label); for i = 1:r offset_c = param.offset(i); arg_c = param.arg(i); offset_x = real(offset_c)*10000; offset_y = imag(offset_c)*10000; arg_x = real(arg_c)*10000; arg_y = imag(arg_c)*10000; x=[offset_x, offset_x + arg_x]; y=[offset_y, offset_y + arg_y]; label=""; for j = 1:col label=strcat(label, param.label(i,j)); endfor eval(sprintf("__gnuplot_set__ arrow %d from %d,%d to %d,%d", i, offset_x, offset_y, offset_x + arg_x, offset_y + arg_y)); #offset_x + arg_x #offset_y + arg_y eval(sprintf("__gnuplot_set__ label %d \"%s\" at %d,%d", i, label, offset_x + arg_x, offset_y + arg_y)); plot(x,y, "1;;"); endfor #__gnuplot_show__ arrow; hold off; __gnuplot_set__ terminal postscript; __gnuplot_set__ output "out.eps"; replot; __gnuplot_set__ terminal x11; __gnuplot_set__ output; pause -1; endfunction # Рисует сразу несколько графиков # # x - матрица # y - что по оси X ;-) function mydraw_n(x,y, title) r = rows(x); c = columns(x); tc = columns(title); graw("reset;"); clearplot; gset grid; gset key top left hold on; for i = 1:r for j = 1:c x1(1,j) = x(i,j); endfor tit = ""; for j=1:tc tit = strcat(tit, title(i,j)); endfor str1 = strcat (";", tit); str2 = strcat (str1, ";"); str = strcat (num2str(i), str2); plot(y,x1,str); endfor hold off; gset terminal postscript; gset output "out.eps"; replot; gset terminal x11; gset output; input("Press Enter for next...\n"); endfunction # Перевод строки, чисто для удобства function newline printf("\n"); endfunction # Вывод красивого заголовка :) function caption(s) printf("\n\n\n\n%s\n",s); n = length(s); for i = 1:n printf("^"); endfor printf("\n\n"); endfunction function caption2(s) printf("\n%s\n\n",s); endfunction # Функция для вывода маленьких поясняющих комментариев # s - строка для вывода function p(s) printf("%s\n",s); endfunction # Печатает комплексное число в показательной форме # на новую строчку переход не осуществляется function pc(a) printf("%ge^(%gj)",abs(a),arg(a)*180/pi); endfunction # Функция для вывода нескольких параметров, удобно для сравнения значений полученных по нескольким # способам function pn(params) c = size(params); i = 1; while(i <= c(2)) pc(params(i)); printf("\t"); i++; endwhile printf("\n"); endfunction # Функция для вывода маленьких поясняющих комментариев с параметром # s - трока для вывода # i1 - значение для вывода function p1(s, i1) printf("%s: %d\n",s, i1); endfunction # Продвинутая версия для вывода заголовка, с автоматической нумерацией, для совместимости с LaTeX # s - строка для вывода function section(s) global SECTION global SUBSECTION global SUBSUBSECTION SECTION = SECTION + 1; SUBSECTION = 0; SUBSUBSECTION = 0; s1 = int2str(SECTION); n = length(s) + length(s1) + 2; n2 = n; if n > getenv("COLUMNS") n2=getenv("COLUMNS"); endif printf("\n\n\n\n"); for i = 1:n2 printf("-"); endfor printf("\n%d. %s\n", SECTION, s); for i = 1:n2 printf("-"); endfor printf("\n\n\n\n"); endfunction # Подзаголовок function subsection(s) global SECTION global SUBSECTION global SUBSUBSECTION SUBSECTION = SUBSECTION + 1; SUBSUBSECTION = 0; s1 = int2str(SECTION); s2 = int2str(SUBSECTION); n = length(s) + length(s1) + length(s2) + 3; n2 = n; if n > getenv("COLUMNS") n2=getenv("COLUMNS"); endif printf("\n\n%d.%d. %s\n", SECTION, SUBSECTION, s); for i = 1:n2 printf("^"); endfor printf("\n\n"); endfunction # Под-подзаголовок function subsubsection(s) global SECTION global SUBSECTION global SUBSUBSECTION SUBSUBSECTION = SUBSUBSECTION + 1; printf("\n%d.%d.%d. %s\n", SECTION, SUBSECTION, SUBSUBSECTION, s); endfunction # Запись 2-м массивов в файл (для передачи gnuplot) function mwrite(fname, x, y) f = fopen(fname,"w"); c = size(x); i = 1; while(i <= c(2)) fprintf(f,"%f %f\n",x(i),y(i)); i++; endwhile fclose(f); endfunction # Интерполяция, есть два крайних значения X1,Y1 и X2,Y2, нужно для X3 выдать Y3 # считается что на (X1,Y1)-(X2,Y2) - прямая function ret = interpol(x1, y1, x2, y2, x3) k = (y2 - y1)/(x2 - x1); b = y1 - k*x1; ret = x3 * k + b; endfunction # =========================================================================================