Лабораторная работа №4
Предисловие
Скопируйте текст и вставьте в текстовый редактор Scilab. Внимание! Некоторые функции не работают в пятом Scilab, поэтому делайте все в четвертой версии программы. Третья работа по интегралам, там вы должны вбить при Тимошине алгоритмы нахождения интегралов inttrap, integrate, intg.
Лабораторная работа №1
clc
clear
function abc
disp('РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ГАУССА')
mprintf('\n\n')
A=input(' введите матрицу коэффициентов:');
mprintf('\n\n')
n=size(A, 'c');
m=size(A, 'r');
//for i=1:m;
//for j=1:n;
// mprintf('введите элемент %g строки, %g столбца',i,j)
//A(i,j)=input('');
//mprintf('\n')
//end
//end
//mprintf('\n\n')
//mprintf('Основная матрица системы\n\n')
// for i=1:m;
// for j=1:n;
// mprintf('%10.8f ', A(i,j))
// end
// mprintf('\n\n')
// end
//mprintf('\n')
A
for t=1:m;
mprintf('введите свободный элемент %g-ый строки',t)
B(t,1)=input('');
mprintf('\n')
end
mprintf('\n\n')
mprintf('столбец свободных элементов\n\n')
for t=1:m;
mprintf('%10.8f \n\n',B(t))
end
mprintf('\n')
if rank(A)==rank([A B])
K=rref([A B]);
if rank(A)==n
mprintf('Система линейных уравнений определена\n\n')
X=K(:,n+1);
else
P=K;
mprintf('Система линейных уравнений не определена\n\n')
disp(K)
mm=rank(A);
mprintf('\n\n')
mprintf('Cвязанных переменных %g \n\n',mm)
for t=1:mm;
mprintf('введите номер %g связанной переменной',t)
AA(t)=input('');
mprintf('\n')
end
mprintf('\n\n')
mprintf('Cвободных переменных %g \n\n',n-mm)
for t=1:n-mm;
mprintf('введите номер %g свободной переменной',t)
AAA(t)=input('');
mprintf('\n')
end
for s=1:mm
mprintf('неизвестное X(%g)=%10.8f',AA(s),P(s,n+1))
for ss=1:n-mm
mprintf('+(%10.8f)*C%g',-P(s,AAA(ss)),AAA(ss))
end
mprintf('\n\n')
end
return
end
else
mprintf('Система линейных уравнений несовместна\n\n')
return
end
mprintf('решение системы:\n\n')
for h=1:n;
mprintf('x%g=%11.9f\n\n',h,X(h));
mprintf('\n')
end
endfunction
abc
disp('Хотите ли вы решить еще одну систему?')
lg=0;
while lg==0
AH=input('Yes/No?(Внимание! Ввод производится в апострофах)\n')
if AH=='Yes'
abc
end
if AH=='No'
mprintf('Спасибо за использование программы!')
lg=lg+1;
end
end
Лабораторная работа №2
В зависимости от своего варианта выбираем задания.
Комбинированный метод
//programma napisana dlya Scilab 4.xxx, kommentarii i prochii tekst napisani latinecei, chtobi ne bilo //problem s kodirovkoi. 'fsolve', 'numdiff' ne rabotayt na Scilab 5.xxx clcclear k=1;clf format('v',25); q1=input('vvedite function:','string')q2=input('vvedite vtoruy proizvodnuy function:','string') deff('otv=func(x)','otv='+string(q1));deff('proiz2=func2(x)','proiz2='+string(q2));while k<=1x1=input('vvedite nachalnuy tochku otrezka, na kotorom rassmatrivaetsya function:');x2=input('vvedite konechnuy tochku otrezka, na kotorom rassmatrivaetsya function:');clfx=[x1:0.1:x2];xgrid;plot(x,eval(q1),'color','r','thickness',2); plot(x,0,'color','g','thickness',2);disp('Ustraivaet li vas postroennii grafik?(WARNING! Vvod proizvoditsya v apostrofah):')xas=input('Yes/No');if xas=='Yes'k=k+1;endif xas=='No'k=k+0;endenda(1)=input('vvedite nachalnuy tochku otrezka, soderzhashego koren: ');b(1)=input('vvedite konechnuy tochku otrezka, soderzhashego koren: '); t=input('vvedite neobhodimoe kol-vo znakov posle zapyatoi: '); n1=func(a(1)); d1=func2(a(1)); e=10^(-t); i=1;if n1*d1<0 while (b(i)-a(i))>2*e a(i+1)=a(i)-func(a(i))*(b(i)-a(i))/(func(b(i))-func(a(i))); b(i+1)=b(i)-func(b(i))/numdiff(func,b(i)); i=i+1; endelse while (b(i)-a(i))>2*e b(i+1)=b(i)-func(b(i))*(b(i)-a(i))/(func(b(i))-func(a(i))); a(i+1)=a(i)-func(a(i))/numdiff(func,a(i)); i=i+1; endendxn=(a(i)+b(i))/2; str=msprintf('%s-10.%g%s','%',t,'g'); mprintf('\nx='+string(str),xn)deff('mashk=my_func(x)', 'mashk=eval(q1)');xmashk=fsolve(a(1),my_func);mprintf('\n')mprintf('Mashinnii koren uravneniya:%12.6f',xmashk)mprintf('\n')hhh=abs(xmashk-xn);mprintf('Doveritelnii interval:%g±%g',xmashk, hhh)Метод половинного сечения (деления)
Метод Ньютона
clc
clear
clf
disp('РЕШЕНИЕ НЕЛИНЕЙНЫХ УРАВНЕНИЙ')
mprintf('\n\n');
x=input('введите начальный интервал');
mprintf('\n\n');
h=input('введите шаг');
mprintf('\n\n');
x=[x(1):h:x(length(x))];
str=msprintf('введите функцию f(x)');
f=input(str);
y=evstr(f);
mprintf('\n\n');
mprintf('f(x)= %s',f);
mprintf('\n\n');
plot2d(x,y',rect=[0,-3,1,3],axesflag=5,leg=f,style=color(250,0,250));
//rect[ xmin,ymin,xmax,ymax]
xgrid
t=input('введите начальное приближение');
mprintf('\n\n');
put=msprintf('y=%s',f);
deff('[y]=p(x)',put)
otv=fsolve(t,p);
mprintf('корень данного уравнения равен: X=%15.13f\n\n',otv)
str1=msprintf('введите производную функции f(x)');
f1=input(str1);
function p=myfunc(x,f)
p=evstr(f)
endfunction
function p=myfunc2(x,f1)
p=evstr(f1);
endfunction
for i=1:length(x)
g1(i)=numdiff(myfunc,x(i));
end
for i=1:length(x)
g2(i)=numdiff(myfunc2,x(i));
end
nach=x(1)-1;
if (y(1)*y(length(x))<0)&and(g1<>0)&and(g2<>0)
if or([(and(g1>0)),(and(g1<0))])
if or([(and(g2>0)),(and(g2<0))])
if y(1)*g2(1)>0
nach=x(1);
elseif y(length(x))*g2(length(x))>0
nach=x(length(x));
else
disp('нет начальной точки')
return
end
else
disp('вторая производная функции не знакопостоянна')
return
end
else
disp('первая производная функции не знакопостоянна')
return
end
else
disp('на концах значение функции с одинаковым знаком, либо производные равны 0')
return
end
mprintf('\n\n');
function [y]=func(a,f)
x=a
y=evstr(f)
endfunction
eps=input('введите точность с которой надо решить уравнение');
a=nach;
del=1;
while del>=eps
u=a;
a=a-func(a)/numdiff(myfunc,a);
del=(max(abs(g2))/(2*min(abs(g1))))*((a-u)^2);
end
mprintf('\n\n');
mprintf('корень полученный методом Ньютона = %16.10f',a)
delg=abs(otv-a);
mprintf('\n\n');
mprintf('абсолютная погрешность = %16.10f',delg)
Метод хорд
clc
clear
h=input('Задайте шаг деления отрезка');
x=input('Задайте область определения');
x=[x(1):h:x(2)];
st=input('Задайте функцию','s');
str=msprintf('f=%s',st);
deff('[f]=nelin(x)',str)
Y=nelin(x);
clf
plot(x,Y,'linestyle','-','color','g','thickness',3)
xtitle(' ','x','Y')
xgrid
D='нет';
while D=='нет'
D=input('График построен верно?','s');
if D=='нет'
x=input('Задайте область определения');
x=[x(1):h:x(2)];
Y=nelin(x);
clf
plot(x,Y,'linestyle','-','color','g','thickness',3)
xtitle(' ','x','Y')
xgrid
end
end
e=length(x);
x0=input('Задайте начальное приближение');
deff('[f]=Y(x)',str)
disp('Решение уравнения средствами SciLab')
xs=fsolve(x0,Y)
t=input('Задайте погрешность');
disp(str)
y2=input('Задайте вторую производную функции f','s');
str2=msprintf('f=%s',y2);
deff('[f]=nelin2(x)',str2)
if nelin2(x(1))*nelin(x(1))<0
C=x(e);X=x(1);
else
C=x(1);X=x(e);
end
Y1=nelin(C);
Y2=nelin(X);
while abs(Y2)>t
X=X-Y2*(X-C)/(Y2-Y1);
Y2=nelin(X);
end
disp('Решение уравнения методом хорд')
X
k=xs-X;
disp('Ошибка вычислений: ')
k
Лабораторная работа №4
clc
clear
//РЕШЕНИЕ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ
// ДИФФЕРЕНЦИАЛЬНОЕ УРАВНЕНИЕ Y2+PI^2Y=PI^2/COS(PI*X) Y(0)=3 Y1(0)=0
//ВВОДИМ НОВЫЕ ПЕРЕМЕННЫЕ X(1)=Y, X(2)=Y1, T=X
//ОПРЕДЕЛЯЕМ ПРАВЫЕ ЧАСТИ СООТВЕТСТВУЮЩЕЙ СИСТЕМЫ УРАВНЕНИЙ ПЕРВОГО ПОРЯДКА
function dx=syst2(t,x)
dx=zeros(2,1);
dx(1)=x(2);
dx(2)=-%pi^2*x(1)+%pi^2/cos(%pi*t);
endfunction
// ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМЫ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ
X0=[3;0];t0=0;t=0:0.01:0.4;
y=ode("stiff",X0,t0,t,syst2);
//ТОЧНОЕ РЕШЕНИЕ ОДУ
z=3*cos(%pi*t)+%pi*t.*sin(%pi*t)+log(cos(%pi*t)).*cos(%pi*t);
//ВЫВОД РЕШЕНИЙ В ОДНОМ ГРАФИЧЕСКОМ ОКНЕ
rect=[min(t),-5,max(t),3];
tics=[2,11,10,5];
plotframe(rect,tics,[%t,%t],["Численное решение ОДУ"], [0,0.2,0.5,0.5]);
plot(t,y);
plotframe(rect,tics,[%t,%t],["Точное решение ОДУ"], [0.5,0.2,0.5,0.5]);
plot(t,z);