- •3 Курса
- •Предисловие
- •Введение
- •Глава 1. Погрешности результата численного решения
- •1.1. Источники ошибок при вычислениях на эвм.
- •1.2. Практическое вычисление функций.
- •1.3. Схема Горнера и метод Ньютона
- •В общем виде алгоритм запишется:
- •1.5. Метод простых итераций.
- •1.6. Метод деления отрезка пополам (метод дихотомии).
- •1.7. Метод хорд.
- •Программа метода дихотомии.
- •Программа метода простых итераций.
- •Программа метода Бэрстоу.
- •Программа метода хорд.
- •Программа метода секущих.
- •Глава 2 Решение систем линейных уравнений
- •2.1. Метод Гаусса.
- •2.2. Метод итераций (Гаусса-Зейделя).
- •2.4. Стандартные операторы мatlab для решения систем линейных алгебраических уравнений.
- •2.5. Решение систем нелинейных уравнений.
Программа метода дихотомии.
function [x1,err,k,y]=dixot(fun,x0,x1,epsilon,max1);
%Метод дихотомии. Точность задана по абсолютной %разности корней.
%Шаг делится пополам сразу, но при этом известно, что %функция на концах интервала разного знака.
%Вызов из основной программы
%[x1,err,k,y]= dixot1('fun',0,3,0.0001,100)
for k=1:max1
deltax=(x1-x0)/2;
x2=x1;
x1=x0+deltax;
y=feval(fun,x1);
if y<0, x0=x1; x1=x2;
end;
err=abs(x1-x0);
if err<epsilon, break, end;
end;
Программа fun.m файла для метода дихотомии
function y=fun(x)
y=-5-2*x+x^3;
Программа метода простых итераций.
function [k,p,err,P]=priter(funit,p0,epsilon,max1)
%Метод итераций. Точность задана по абсолютной %разности корней
%Вызов из основной программы %[k,p,err,P]=priter('funit',1.6,0.00001,20)
P(1)=p0;
for k=2:max1
P(k)=feval(funit,P(k-1));
err=abs(P(k)-P(k-1));
relerr=err/(abs(P(k))+eps);
p=P(k);
if(err<epsilon)|(relerr<epsilon),break;end
end
if k==max1
disp('число итераций исчерпано')
end
P=p' ;
Программа funit.m файла для метода итераций.
function p=funit(p)
p=1+p - p.^2/4;
Программа метода Бэрстоу.
function [p,q]=berst
A=[1 4 6 4 1]; n=5;
b=zeros(1,n+2);
c=zeros(1,n+2);
p=-1.5; q=-0.9; dp=1;; dq=1;
while ((abs(dp)>10^-15) & (abs(dq)>10^-15))
for k=3:n+2
b(k)=A(k-2)+p*b(k-1)+q*b(k-2);
c(k)=b(k)+p*c(k-1)+q*c(k-2);
end
dp1=b(n+2)*c(n-1)-b(n+1)*c(n);
dp2=c(n)*c(n)-c(n+1)*c(n-1);
dq1=b(n+1)*c(n+1)-b(n+2)*c(n);
dp=dp1/dp2;
dq=dq1/dp2;
p=p+dp; q=q+dq;
end
Программа метода хорд.
function [c,err,yc,k]=hord(funh,a,b,delta,epsilon,max1)
%Вход: funh-функция,
% a,b-начальный интервал,
% delta-допустимое отклонение для корня,
% epsilon-допустимое отклонение для y,
% max1- максимальное число итераций.
%Выход: с-приближение к корню,
% err- ошибка вычисления точки c,
% yс- значение функции в точке c,
% k- число итераций.
%Обращение из программы %[c,err,yc,k]=hord('funh',0,2,0.0001,0.0001,10)
ya=feval(funh,a);
yb=feval(funh,b);
if ya*yb>0 disp('знаки совпадают'), break,end
for k=1:max1
dx=yb*(b-a)/(yb-ya);
c=b-dx;
ac=c-a;
yc=feval(funh,c);
if yc==0,break;
elseif yb*yc>0 b=c; yb=yc;
else a=c; ya=yc; end
dx=min(abs(dx),ac);
if abs(dx)<delta,break,end
if abs(yc)<epsilon,break,end
end
c;
err=abs(b-a)/2;
yc=feval(funh,c);
Программа funh.m файла для метода хорд.
function y=funh(x)
y=x*sin(x)-1;
Программа метода секущих.
function [p1,err,k,y]=sekusch(funs,p0,p1,delta,epsilon,max1)
%Вход funs-функция
% p0,p1-начальные приближения
% delta-допустимое отклонение p1
% epsilon-допустимое отклонение y
% max1- максимальное число итераций
%Выход p1-приближение к корню
% err- ошибка вычисления
% k- число итераций
% y- значение функции
%Обращение из программы [p1,err,k,y]=sekusch('funs',-2.6,-%2.4,0.0001,0.0001,10)
for k=1:max1
p2=p1-feval(funs,p1)*(p1-p0)/(feval(funs,p1)-feval(funs,p0));
err=abs(p2-p1);
relerr=2*err/(abs(p2)+delta);
p0=p1;
p1=p2;
y=feval(funs,p1);
if (err<delta)|(relerr<delta)|(abs(y)<epsilon),break,end
end
Программа funs.m файла для метода секущих.
function y=funs(x)
y=2-3*x+x.^3;