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