Thursday, January 9, 2020

ЛР11 Программирование (2.3 В21) - IV

LabWork11
📑 IT Online Mini Campus. Task 2.3
IV. Программа SageMath (Python)
var('k'); E=10^(-4)
X1,X2,H=.5,.7,.05; SEG=[X1,X1+H,..,X2]
def nfind(controlf,sumf,e,seg):
    cond=True; n=1
    while cond:
        diff=[abs(controlf(x)-sumf(x,n)).n()<e for x in seg]
        cond=sum(diff)!=len(diff); n+=1
    return(n-1)
def nplottable(controlf,sumf,n,seg,var):
    t=[['x','sumf(x)','controlf(x)']]
    sumline3,sumlinen,controlline=[],[],[]
    for x in seg:
        t+=[[x,sumf(x,n).n(),controlf(x).n()]]
        sumline3+=[[x,sumf(x,2).n()]]
        sumlinen+=[[x,sumf(x,n).n()]]
        controlline+=[[x,controlf(x).n()]]
    (list_plot(sumline3,size=50,
               legend_label='sum function n=2',
               title='Variant %d: N = %d'%(var,n))+\
     list_plot(sumlinen,size=50,color='green',
               legend_label='sum function n=%d'%n)+\
     list_plot(controlline,color='red',
               legend_label='control function'))\
    .show(gridlines=True) 
    show(table(t))
controlf21(x)=2*x-x*exp(-x^2)-sin(x)
sumf21(x,n)=sum((-1)^(k+1)*x^(2*k+1)*(1/factorial(k)+\
                1/factorial(2*k+1)),k,1,n)
N21=nfind(controlf21,sumf21,E,SEG)
nplottable(controlf21,sumf21,N21,SEG,21)



ЛР11 Программирование (2.3 В21) - III

LabWork11
📑 Compile Pascal Online
III. Программа Pascal
Program Lab11;
var X,X1,X2,H: real;
var N,i: integer;
function factorial(i:integer): integer;
begin
    if i=1 then factorial:=1
    else factorial:=factorial(i-1)*i;        
end;
function power(X:real;i:integer): real;
begin
    if i=1 then power:=1
    else power:=power(X,i-1)*X; 
end;
function f(X:real): real;
begin
    f:=2*X-X*exp(-X*X)-sin(X);
end;
function fs(X:real;N:integer): real;
begin
    fs:=0;
    for i:=1 to N do
    begin
    fs:=fs+power(-1,i+1)*power(X,2*i+1)*(1/factorial(i)+
        1/factorial(2*i+1));
    end;
end;
begin
    writeln('Лаб.11':38);
    write('Начальное значение аргумента X1: '); 
    readln(X1); writeln(X1:5:2);
    write('Конечное значение аргумента X2: '); 
    readln(X2); writeln(X2:5:2);
    write('Величина изменения аргумента H: '); 
    readln(H); writeln(H:5:2);
    write('Количество суммируемых значений ряда N: '); 
    readln(N); writeln(N:3);
    X:=X1; writeln('Таблица значений');
    if (X2<=X1)or(X2-X1<H) then
        writeln('Данные не корректны')
    else
    begin
        while X2>X-H do
        begin
            writeln(X:5:2,' ',fs(X,N):9:7,' ',f(X):9:7);
            X:=X+H;
        end;
    end;
end.


STDIN
0.5
0.7
0.05
5



ЛР11 Программирование (2.3 В21) - II

LabWork11

II. Алгоритм

ЛР11 Программирование (2.3 В21) - I

LabWork11
I. Внешняя спецификация
1. Условие задачи
Составить программу для вычисления таблицы значений суммы ряда (см. задание 1.5), а также соответствующей функции (для контроля) для Х, изменяющегося от Хнач до Хкон с шагом Н. Для проверки правильности программы задать Хнач=0.5, Хкон=0.7, Н=0.05.

2. Состав данных
Тип
Имя
Смысл
Структура
Исходные данные
вещественный
Х1
начальное значение аргумента X
простая переменная
вещественный
Х2
конечное значение аргумента X
простая переменная
вещественный
Н
изменение значения аргумента
простая переменная
целый
N
количество суммируемых значений ряда
простая переменная
Выходные данные
вещественный
f(Х)
значение контрольной функции для аргумента Х
функция
вещественный
fs(X,N)
значение суммы ряда из N элементов для аргумента Х
функция
вещественный
X
значение аргумента
простая переменная
Промежуточные данные
целый
i
текущее значение номера элемента ряда
простая переменная

3. Форма ввода
1 5
<Х1>
1 5
<Х2>
1 5
<Н>
1 3
<N>

4. Выходная форма
1 5
<Х1>
1 5
<Х2>
1 5
<Н>
1 3
<N>
1 5
<Х>
1 9
<fs(X,N)>
1 9
<f(Х)>

5. / 6. Проработка фрагментов программы

if (X2<=X1)or(X2-X1<H) then
    writeln('Данные не корректны')
else
begin
end;

Фрагмент программы проверяет, не превышает ли начальное значение аргумента его конечное значение и не меньше ли разность конечного и начального значений, чем величина изменения аргумента.   

7. Аномалии
Если начальное значение аргумента больше конечного или разность конечного и начального значений меньше заданной величины изменения аргумента, то данные заданы некорректно, программа выводит соответствующее сообщение. 
Ошибки программы возможны и при некорректном вводе значений пользователем. Сообщение в таких случаях выдает компилятор.

8. Тесты
1) с положительным результатом

0.5
0.7
0.05
5

2) с отрицательным результатом

0.9
0.7
0.01
20


ЛР10 Программирование (1.7 В21) - IV

LabWork10
📑 IT Online Mini Campus. Task 1.7
IV. Программа SageMath (Python)
E=10^(-4); A,B=E,2-E;
def find_root_div2(f,a,b,e,var):
    pretty_print(html(latex(f)))
    if sign(f(a))==sign(f(b)):
        s='It is not possible to use '
        s+='this decision method for the segment'
        print(s)
    else:
        print('Iteration steps'); t=[['f(a)','f((a+b)/2)','f(b)']]
        while b-a>=e:            
            ab=a+(b-a)/2; t+=[[f(a).n(),f(ab).n(),f(b).n()]]
            if sign(f(a))!=sign(f(ab)):
                if f(ab)==0: break 
                b=ab
            else: a=ab
        show(table(t))
        print('var %d f(x)=0 =>\nprogram answer: x≈%.10f'%(var,ab))
        print('SageMath answer: x≈%.10f'%find_root(f21(x),0,2))
f21(x)=log(20/sqrt(.009))-1.5*(exp(x/3)+exp(-x/3))-x
find_root_div2(f21,A,B,E,21)


ЛР10 Программирование (1.7 В21) - III

III. Программа Pascal
Program Lab10;
var A,B,E,X: real;
function f(X:real): real;
begin
    f:=ln(20/sqrt(0.009))-1.5*(exp(X/3)+exp(-X/3))-X;
end;
begin
    writeln('Лаб.10':38);
    write('Начало отрезка A: '); 
    readln(A); writeln(A:5:2);
    write('Конец отрезка B: '); 
    readln(B); writeln(B:5:2);
    write('Минимальная длина отрезка E: '); 
    readln(E); writeln(E:5:4);
    writeln('Шаги итерации');
    if ((f(A)>=0) and (f(B)>=0)) or ((f(A)<0) and (f(B)<0)) then
        writeln('Невозможно найти корень уравнения указанным методом')
    else
    begin
        while B-A>=E do
        begin
            X:=A+(B-A)/2;
            writeln(f(A):7:5,' ',f(X):7:5,' ',f(B):7:5);
            if f(X)=0 then break;
            if ((f(A)>0) and (f(X)>0)) or ((f(A)<0) and (f(X)<0)) then
                A:=X
            else B:=X;
        end;
        writeln('Корень уравнения: ',X:7:5);
    end;
end.


STDIN
0
2
0.0001