Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Звіт
про виконання лабораторної роботи №3
з курсу “Алгоритмічні основи криптології”
на тему: “ Метод Ньютона для розв’язування
систем нелінійних рівнянь ”
Мета роботи: ознайомитися з найпоширенішим ітераційним методом розв’язування систем нелінійних рівнянь – методом Ньютона.
Завдання: написати програму на мові програмування Сі яка б розв’язувала систему нелінійних рівнянь методом Ньютона без обертання матриці, розв’язок матриці методом LU-розкладу, а обчислення похідних методом кінцевих різниць.
x1 = x12 – x22 – 0.1 ,
x2 = 2x1x2 + 0.1 ,
x10 = 0,
x20 = 0 Блок – схема алгоритму роботи програми
Блок-схема функції fynct
Текст програми:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#define n 2
const int g=1;
const double e=0.00001;
const double h=0.00000001;
double fynct(double *x, int j)
{
if (j==0) return (x[0]-x[0]*x[0]-x[1]*x[1]+0.1);
else return (x[1]-2*x[0]*x[1]-0.1);
}
main()
{
double x1[n],x2[n],f[n],jac[n][n];
int i,j,k,m;
double s,s1,max;
for(i=0;i<n;i++) x2[i]=x1[i]=0;
do
{
//Kintsevux poxidnuh
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
f[i]=-fynct(x1,i);
x2[j]+=h;
jac[i][j]=(fynct(x2,i)-fynct(x1,i))/h;
x2[j]-=h;
}
//Rozvjaz metodom LU
jac[0][1]/=jac[0][0];
f[0]/=jac[0][0];
for(k=1;k<n;k++)
{
for(i=k;i<n;i++)
for(m=0;m<=k-1;m++)
jac[i][k]-=jac[i][m]*jac[m][k];
if (k==(n-1)) goto g;
for(j=k+1;j<n;j++)
{
s1=0;
for(m=0;m<=k-1;m++)
s1+=jac[k][m]*jac[m][j];
jac[k][j]=(jac[k][j]-s1)/jac[k][k];
}
g: s=0;
for(m=0;m<=k-1;m++)
s+=jac[k][m]*f[m];
f[k]=(f[k]-s)/jac[k][k];
}
for(i=0;i<n;i++)
x2[i]=0;
x2[n-1]=f[n-1];
for(i=n-2;i>=0;i--)
{
s=0;
for(m=i+1;m<n;m++)
s+=jac[i][m]*x2[m];
x2[i]=f[i]-s;
}
max=fabs((x2[0])/x1[0]);
for(i=1;i<n;i++)
if (max<fabs(x2[i]/x1[i]))
max=fabs((x2[i])/x1[i]);
for(i=0;i<n;i++)
x1[i]+=x2[i];
}
while (max>=e);
printf("Results:\n");
for(i=0;i<n;i++)
printf("x%d=%lf\n",i+1,x1[i]);
getchar();
printf("Perevirka:\n");
for(i=0;i<n;i++)
printf("%lf\n",fabs(fynct(x1,i)));
getchar();
}
Результат виконання програми:
Висновок: Розв’язання систем нелінійних алгебраїчних рівнянь методом Ньютона можна досить легко реалізувати на ЕОМ за допомогою програми в середовищі Сі. Розв’язання таких систем на ЕОМ є дуже актуальним, оскільки цей процес є набагато легшим та короткотривалішим ніж розв’язання систем нелінійних рівнянь вручну.