пределить графически корни уравнения:
3
. Определить графически корни уравнения:
4
. Определить графически корни уравнения:
2 . Определить аналитически корни уравнения:
ЛАБОРАТОРНАЯ РАБОТА №10 «Методы решения систем линейных уравнений ». Студента группы ПВ-22 Малютина Максима.
Задание. Решить систему уравнений с точностью до 0,001. а) Методом итераций
б) Методом Ньютона. С
истема :uses crt; type fun=function(x:real):real;
funcs=array[1..4] of fun;
fun2=function(x,y:real):real;
function fun_x(y:real):real; begin fun_x:=-0.4-sin(y); end;
function fun_y(x:real):real; begin fun_y:=(cos(x+1))/2; end;
function f(x,y:real):real; begin f:=sin(x+y)-1.5*x-0.1 end;
function g(x,y:real):real; begin g:=x*x+y*y-1 end;
function dfx(x,y:real):real; begin dfx:=sin(x+y)-1.5 end;
function dfy(x,y:real):real; begin dfy:=sin(x+y) end;
function dgx(x,y:real):real; begin dgx:=2*x end;
function dgy(x,y:real):real; begin; dgy:=2*y end;
Procedure Iteration(funx,funy:fun;x,y,e,q:real); var xn,yn:real;
m:byte; begin e:=abs(e*(1-q)/q); xn:=x; yn:=y; m:=0; repeat
x:=xn;y:=yn;
xn:=funx(y);
yn:=funy(x);
inc(m) until (abs(xn)+abs(yn)-abs(x)-abs(y))<e; writeln('Решение : X = ',xn,'. Y= ',yn) end;
Procedure Nuton(dfx,dfy,dgx,dgy,f,g:fun2;x,y,eps:real); var d,d1,d2,xn,yn,dx1,dy1:real; begin xn:=x;yn:=y; repeat
x:=xn;y:=yn;
d:=dfx(x,y)*dgy(x,y)-dfy(x,y)*dgx(x,y);
d1:=-f(x,y)*dgy(x,y)+g(x,y)*dfy(x,y);
d2:=-g(x,y)*dfx(x,y)+f(x,y)*dgx(x,y);
dx1:=d1/d;dy1:=d2/d;
xn:=x+dx1;
yn:=y+dy1; until (abs(xn)+abs(yn)-abs(x)-abs(y))<eps; writeln('Решение : X = ',xn,' Y= ',yn) end;
var x,y,q,eps:real; begin clrscr; writeln('Введите заданную точность'); readln(eps); writeln('Введите начальные значения X, Y '); readln(x,y); writeln('Введите q '); readln(q); Iteration(fun_x,fun_y,x,y,eps,q); writeln('Введите начальные значения X, Y '); readln(x,y); Nuton(dfx,dfy,dgx,dgy,f,g,x,y,eps) end.
Результаты работы программы:
Введите заданную точность 0.001 Введите начальные значения X, Y -0.88 0.45 Введите q 0.9 Решение : X = -8.76048170584909E-0001. Y= 4.96164420593686E-0001 Количество шагов = 7 Введите начальные значения X, Y 0.58 0.8 Решение : X = 5.89956109385639E-0001 Y= 8.07435397634436E-0001 Количество шагов = 4
ЛАБОРАТОРНАЯ РАБОТА №12 «Численное интегрирование ».
Студента группы ПВ-22 Малютина Максима.
Известно, что определенный интеграл функции
типа численно представляет собой площадь криволинейной трапеции ограниченной кривыми x=0, y=a, y=b и y= (Рис. 1). Есть два метода вычисления этой площади или определенного интеграла — метод трапеций (Рис. 2) и метод средних прямоугольников (Рис. 3).
Рис. 1. Криволинейная трапеция.
Рис. 2. Метод трапеций.
Рис. 3. Метод средних прямоугольников.
По методам трапеций и средних прямоугольников соответственно интеграл равен сумме площадей прямоугольных трапеций, где основание трапеции какая-либо малая величина (точность), и сумма площадей прямоугольников, где основание прямоугольника какая-либо малая величина (точность), а высота определяется по точке пересечения верхнего основания прямоугольника, которое график функции должен пересекать в середине. Соответственно получаем формулы площадей — для метода трапеций:
,
для метода средних прямоугольников:
.
Однако существуют еще несколько методов нахождения приближенного значения определенного интеграла.
Остановимся поподробнее на формуле Симпсона и т.н. формуле «трех восьмых».
Формула Симпсона:
Формула «трех восьмых»:
Число разбиений n должно быть кратно трем.
Экстраполяция по Ричардсону.
Пусть In1 и In2 – два приближеных значения интуграла, найденные по одной и той же формуле при n1 и n2 (n2>n1). Тогда более точное значение этого интеграла можно найти по формуле:
,где m – порядок остаточного члена (для формулы трапеций m=2, для формулы Симпсона m=4)
Соответственно этим формулам и составим алгоритм.
Листинг программы.
program Integral;
uses Crt, Dos;
function Fx(x:real):real;
begin
fx:=(1+0.9*x*x)/(1.3+sqrt(0.5*x*x+1))
{В этом месте запишите функцию, для вычисления интеграла.}
end;
Function Yi(x,h:real;i:LongInt):real;
begin
Yi:=fx(x+i*h)
end;
Function CountBar(x1,x2,h:real):real;
var xx1,xx2:real;
c:longint;
i:real;
begin
writeln('-->Метод средних прямоугольников.');
i:=0;
for c:=1 to round(abs(x2-x1)/h) do
begin
write('Итерация ',c,chr(13));
xx1:=Fx(x1+c*h);
xx2:=Fx(x1+c*h+h);
i:=i+abs(xx1+xx2)/2*h
end;
writeln('------------------------------------------------');
CountBar:=i
end;
Function CountTrap(x1,x2,h:real):real;
var xx1,xx2,xx3:real;
c:longint;
i:real;
begin
writeln('--> Метод трапеций.');
i:=0;
for c:=1 to round(abs(x2-x1)/h) do
begin
write('Итерация ',c,chr(13));
xx1:=Fx(x1+c*h);
xx2:=Fx(x1+c*h+h);
if xx2>xx1 then xx3:=xx1 else xx3:=xx2;
i:=i+abs(xx2-xx1)*h+abs(xx3)*h
end;
writeln('------------------------------------------------');
CountTrap:=i
end;
Function CountSimpson(x1,x2,h:real):real;
var i:real;
j,n:LongInt;
begin
n:=round(abs(x2-x1)/h);
writeln('-->Метод Симпсона.');
i:=fx(x1);
j:=2;
while j<=n-1 do
begin
i:=i+4*yi(x1,h,j)+2*yi(x1,h,j+1);
j:=j+2
end;
writeln('------------------------------------------------');
CountSimpson:=h/3*(i+4*yi(x1,h,j)+yi(x1,h,j+1));
end;
Function CountThree(x1,x2,h:real):real;
var s1,s2,s3:real;
i,n:LongInt;
begin
writeln('-->Метод "Трех восьмых".');
n:=round((abs(x2-x1))/h);
if n mod 3=0 then
begin
s1:=fx(x1)+fx(x2);
s2:=0;s3:=0;
for i:=1 to n do
begin
if i mod 3=0 then s3:=s3+yi(x1,h,i)
else s2:=s2+yi(x1,h,i)
end;
CountThree:=3*h/8*(s1+3*s2+2*s3);
writeln('------------------------------------------------')
end
else writeln('Неверное число шагов !!! (Должно быть кратно 3) ')
end;
Function Richardson(i1,i2,m,a:real):double;
var b:double;
begin
b:=a/(exp(m*ln(a))-1);
Richardson:=i2+b*(i2-i1)
end;
var i1,i2,i,x1,x2,h1,h2:real;
c:byte;
n1,n2,m:word;
begin
writeln('------------------------------------------------');
writeln('-= Программа вычисления определенного интеграла =-');
writeln('Введите исходные значения: ');
write('Начальное значение x (x нижн)=');Readln(x1);
write('Конечное значение x (x верхн)=');Readln(x2);
repeat
write('Вычисление по числу итераций(1) или по шагу(2)? ');readln(c);
until (c=1) or (c=2);
case c of
1: begin
write('Количество итераций (n1)=');Readln(n1);
write('Количество итераций (n2)=');Readln(n2);
h1:=(abs(x2-x1))/n1;
h2:=(abs(x2-x1))/n2;
writeln('Шаг вычисления (h1)=',h1);
writeln('Шаг вычисления (h2)=',h2)
end;
2: begin
write('Шаг вычисления (h1)=');Readln(h1);
write('Шаг вычисления (h2)=');Readln(h2);
writeln('Количество итераций (n1)=',round(abs(x2-x1)/h1));
writeln('Количество итераций (n2)=',round(abs(x2-x1)/h2))
end;
end;
i1:=CountTrap(x1,x2,h1);
writeln('Интеграл=',i1);
i2:=CountTrap(x1,x2,h2);
writeln('Интеграл=',i2);
writeln('Экстраполирование Ричардсона для случая трапеций: ');
writeln('Интеграл = ',Richardson(i1,i2,2,n2/n1));
readln;
i1:=CountBar(x1,x2,h1);
writeln('Интеграл = ',i1);
i2:=CountBar(x1,x2,h2);
writeln('Интеграл = ',i2);
writeln('Экстраполирование Ричардсона для случая прямоугольников ');
writeln('Интеграл = ',Richardson(i1,i2,3,n2/n1));
writeln('------------------------------------------------');
i1:=CountSimpson(x1,x2,h1);
writeln('Интеграл = ',i1);
i2:=CountSimpson(x1,x2,h2);
writeln('Интеграл = ',i2);
writeln('Экстраполирование Ричардсона для случая Симпсона ');
writeln('Интеграл = ',Richardson(i1,i2,3,n2/n1));
i1:=CountThree(x1,x2,h1);
writeln('Интеграл = ',i1);
i2:=CountThree(x1,x2,h2);
writeln('Интеграл = ',i2);
writeln('Спасибо за использование программы ;-) ');
readln
end.
Результаты работы программы:
------------------------------------------------
-= Программа вычисления определенного интеграла =-
Введите исходные значения:
Начальное значение x (x нижн)=0.9
Конечное значение x (x верхн)=2.34
Вычисление по числу итераций(1) или по шагу(2)? 1
Количество итераций (n1)=4
Количество итераций (n2)=5
Шаг вычисления (h1)= 3.60000000000127E-0001
Шаг вычисления (h2)= 2.88000000000011E-0001
--> Метод трапеций.
------------------------------------------------
Интеграл= 3.21492525852918E-0003
--> Метод трапеций.
------------------------------------------------
Интеграл= 4.61840165326066E-0003
Экстраполирование Ричардсона для случая трапеций:
Интеграл = 7.73723808599729E-0003
------------------------------------------------
Интеграл = 2.53128978246764E-0003
Экстраполирование Ричардсона для случая прямоугольников
Интеграл = 3.65111028007424E-0003
------------------------------------------------
-->Метод Симпсона.
------------------------------------------------
Интеграл = 1.07491181758519E-0002
-->Метод Симпсона.
------------------------------------------------
Интеграл = 9.02681082661161E-0003
Экстраполирование Ричардсона для случая Симпсона
Интеграл = 6.76804708990304E-0003
------------------------------------------------
-->Метод "Трех восьмых".
Неверное число шагов !!! (Должно быть кратно 3)
Интеграл = 0.00000000000000E+0000
------------------------------------------------
-->Метод "Трех восьмых".
Неверное число шагов !!! (Должно быть кратно 3)
Интеграл = 0.00000000000000E+0000
------------------------------------------------
-->Метод Гаусса.
Интеграл = 1.40977850823276E-0002
------------------------------------------------
-->Метод Гаусса.
Интеграл = 1.40649829885291E-0002
Спасибо за использование программы ;-)
З
адание 1. Отделить корни уравнения графически и уточнить один из них методом хорд с точностью до 0,001.x
=0.672275594. Количество шагов – 5.З
адание 2. Отделить корни уравнения аналитически и уточнить один из них методом хорд с точностью до 0,001.x=-0.3219021. Количество шагов – 5.
То же самое методом хорд:
1. x=0.67235827. Количество шагов – 3.
2. x=-0.3222222. Количество шагов – 3.
З
адание 1. Комбинированным методом хорд и касательных решить уравнение 3-ей степени, вычислив корни с точностью до 0,001.X1=-0.810246. Количество шагов – 2.
X2= 1.168039. Количество шагов – 2.
X3=2.641798. Количество шагов – 2.
{определение корня методом хорд}
uses crt;
function fun(x:real):real;{заданная функция}
Begin
fun:=x+ln(x)/ln(10)-0.5;
End;
function fun2(x:real):real;{вторая производная заданной функции}
Begin
fun2:=-1/ln(10)/x/x;
End;
var a,b,e,e1,min,max,x,x1,n,f,f1:real;
m:byte;
BEGIN
clrscr;
writeln('Введите промежуток где возможен корень');
write('a=');readln(a);
write('b=');readln(b);
write('Введите точность E=');readln(e);
writeln('Введите m и M');
write('m=');readln(min);
write('M=');readln(max);
if fun(a)*fun2(a)>0 then
begin
n:=a;
x:=b;
end
else
begin
n:=b;
x:=a;
end;
f:=fun(n);
e1:=(e*min)/(max-min);
m:=0;
repeat
x1:=x;
f1:=fun(x1);
x:=x1-(f1*(n-x1))/(f-f1);
m:=m+1;
until e1>=abs(x-x1);
writeln('Корень =',x);
writeln(m);
END.
{определение корня методом Ньютона}
uses crt;
function fun(x:real):real;{заданная функция}
Begin
fun:=x*x*x+3*x+1;
End;
function fun1(x:real):real;{первая производная}
Begin
fun1:=3*(x*x+1);
End;
function fun2(x:real):real;{вторая производная}
Begin
fun2:=6*x;
End;
var a,b,e,e1,min,max,x,x1,n:real;
m:byte;
BEGIN
clrscr;
writeln('Введите промежуток где возможен корень');
write('a=');readln(a);
write('b=');readln(b);
write('Введите точность E=');readln(e);
writeln('Введите m и M');
write('m=');readln(min);
write('M=');readln(max);
if fun(a)*fun2(a)>0 then
begin
n:=b;
x:=a;
end
else
begin
n:=a;
x:=b;
end;
e1:=sqrt((2*min*e)/max);
m:=0;
repeat
x1:=x;
x:=x1-fun(x1)/fun1(x1);
m:=m+1;
until e1>=abs(x-x1);
writeln('Корень =',x);
writeln(m);
END.
{определение корня комбинированным методом}
uses crt;
function fun(x:real):real;{заданная функция}
Begin
fun:=x*x*x-3*x*x+2.5;
End;
function fun1(x:real):real;{первая производная}
Begin
fun1:=3*x*(x-2);
End;
function fun2(x:real):real;{вторая производная}
Begin
fun2:=6*x-6;
End;
procedure chord(n,x1:real;var x:real);{метод хорд}
Begin
x:=x1-(fun(x1)*(n-x1))/(fun(n)-fun(x1));
End;
procedure nuton(x1:real;var x:real);{метод Ньютона}
Begin
x:=x1-fun(x1)/fun1(x1);
End;
var x,a,b,e,xx,x1,xn,n,n1:real;
m:byte;
BEGIN
clrscr;
writeln('Введите промежуток где возможен корень');
write('a=');readln(a);
write('b=');readln(b);
write('Введите точность E=');readln(e);
if fun(a)*fun2(a)>0 then
begin
n:=a;x:=b;
n1:=b;x1:=a;
end
else
begin
n:=b;x:=a;
n1:=a;x1:=b;
end;
m:=0;
repeat
nuton(x1,xn);
chord(xn,x,xx);
x:=xx;
x1:=xn;
m:=m+1;
until abs(xx-xn)<=e;
writeln('Корень =',(xx+xn)/2);
writeln(m);
END.
Задание 1. Отделить корни уравнения графически и уточнить один из них методом итераций с точностью до 0,001.
X=0,213310688. Количество шагов – 3.
З
X=-1,1246907. Количество шагов – 4.
{определение корня методом итераций}
uses crt;
function fun(x:real):real;
begin
fun:=x*x*x-0.1*x*x+0.4*x+2;
end;
function fun1(x:real):real;
begin
fun1:=3*x*x-0.2*x+0.4;
end;
var u,x,xn,q:real;
min,max:real;
a,b,e:real;
m:byte;
begin
clrscr;
writeln('Введите промежуток где возможен корень');
write('a=');readln(a);
write('b=');readln(b);
write('Введите точность E=');readln(e);
writeln('Введите m и M');
write('m=');readln(min);
write('M=');readln(max);
u:=2/(min+max);
q:=(max-min)/(max+min);
e:=abs(e*(1-q)/q);
x:=a;
m:=0;
repeat
xn:=x;
x:=xn-u*fun(xn);
m:=m+1;
until abs(x-xn)<e;
writeln('Корень =',x);
writeln(m);
end.
ЛАБОРАТОРНАЯ РАБОТА №3 «Алгебра матриц». Студента группы ПВ-22 Малютина Максима.
Задание. Обратить матрицу методом разбиения ее на произведение двух треугольных матриц.
В
ариант 8.При разбиении матрицы А на две треугольные, используются следующие формулы:
Получены следующие результаты: М
атрица T: Матрица R:program lab_3; { Лабораторная работа по вычмслительной математике N 3 Нахождение матрицы, обратной данной }
const Sizem = 10; { максимальная размерность матрицы }
type mattype = array [1..Sizem,1..Sizem] of double;
{ процедура для вывода матрицы на экран } procedure WriteMat (var m : mattype;n,n1 : byte); var k,i : byte; begin