Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Вышка.doc
Скачиваний:
6
Добавлен:
22.11.2018
Размер:
102.91 Кб
Скачать

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

clc

clear

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<=1

x1=input('vvedite nachalnuy tochku otrezka, na kotorom rassmatrivaetsya function:');

x2=input('vvedite konechnuy tochku otrezka, na kotorom rassmatrivaetsya function:');

clf

x=[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;

end

if xas=='No'

k=k+0;

end

end

a(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;

end

else

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;

end

end

xn=(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

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

xgrid

mprintf('\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;

end

i=i+1;

end

X=(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