Лабораторная работа №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)

Метод половинного сечения (деления)

clcclearclfz=input('Введите начальное значение отрезка');mprintf('\n');p=input('Введите конечное значение отрезка');mprintf('\n');c=input('Введите шаг отрезка');x=[z:c:p]; mprintf('\n');str=msprintf('введите функцию f(x)');f=input(str);u=evstr(f);plot(x,u);xgridmprintf('\n');t=input('введите начальное приближение');put=msprintf('y=%s',f);deff('[y]=p(x)',put);otv=fsolve(t,p);mprintf('\n');a=input('Введите левый предел отрезка определения решения'); mprintf('\n');b=input('Введите правый предел');g=input('Введите погрешность вычисления отрезка определения решения');while (b-a)>g; i=1; c=(a+b)/2;x(i)=c;x(i+1)=b;y=evstr(f);if y(i)*y(i+1)<0; a=c;else y(i)*y(i+1)>0; b=c;endi=i+1;endX=(a+b)/2;mprintf('\n\n');mprintf('Корень уравнения равен %g',X)v=abs(otv-X);mprintf('\n\n');mprintf('Машинный корень %g\n\n',otv) mprintf('Погрешность :%g',v)

Метод Ньютона

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);

Наши рекомендации