- •1. Решение систем линейных алгебраических уравнений (слау)
- •Решение:
- •2.Аппроксимация функций
- •Решение:
- •3. Вычисление производных и интегралов
- •Решение:
- •4. Методы решения нелинейных уравнений
- •Решение:
- •5. Методы нахождения минимума функции одной переменной
- •Решение:
- •6. Решение задачи Коши для обыкновенных дифференциальных уравнений Варианты заданий
1. Решение систем линейных алгебраических уравнений (слау)
Составить программу решения СЛАУ порядка n и решить систему линейных уравнений пятого порядка с трехдиагональной симметричной матрицей вида
№ вар. |
Mетод |
d |
q |
|
5 |
MP |
-3 |
-4.67 |
- |
Решение:
Программа для решения СЛАУ методом прогонки приведена в листинге 1.1.
Результаты работы программы приведены на рис. 1.1.
Листинг 1.1.
#include "stdafx.h"
#include <math.h>
#include <iostream>
using namespace std;
int i,n,k,n1=5;
double t,z,q,d;
double A[5][5];
double B[5];
double eps[5];
double X[5];
double et[5];
int main()
{
for (i=0;i<5;i++)
{
for (k=0;k<5;k++)
{
A[i][k]=0;
}
}
cout<<"Enter q: ";
cin>>q;
cout<<endl<<"Enter d: ";
cin>>d;
cout<<endl;
A[0][0]=A[4][4]=q;
A[1][1]=A[2][2]=A[3][3]=-2;
for (i=0;i<4;i++)
{
k=i+1;
A[i][k]=A[k][i]=1;
}
cout<<"Matrix A:"<<endl;
for (i=0;i<5;i++)
{
for (k=0;k<5;k++)
{
cout<<A[k][i]<<"\t ";
}
cout<<endl;
}
B[0]=B[4]=0;
for(i=1;i<=3;i++)
{
B[i]=d;
}
cout<<"Matrix B:"<<endl;
for (i=0;i<5;i++)
{
cout<<B[i]<<endl;
}
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
for(i=1;i<n;i++)
{
z=A[i][i]+A[i][i-1]*eps[i-1];
eps[i]=-A[i][i+1]/z;
et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
}
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
for(i=n-1;i>=0;i--)
{
X[i]=eps[i]*X[i+1]+et[i];
}
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
{
cout<<X[i]<<endl;
}
return 0;
}
Рис.1.1.
2.Аппроксимация функций
Требуется аппроксимировать заданную исходную функцию f(x) многочленом на интервале [a, b]. Задано количество неизвестных параметров n, вид аппроксимации и m - количество точек, в которых задана функция. Таблица исходной функции yi=f(xi) вычисляется в точках xi=a+(i-1)(b-a)/(m-1), i=1, m. Используя полученную таблицу (xi, yi), требуется вычислить значения функций f(xj), φ(xj, c) и погрешность d(xj)=f(xj)-φ(xj, c) в точках xj=a+(j-1)(b-a)/20, j=1, 20.
N |
Функция f(x) |
a |
b |
m |
n |
Вид аппроксимации |
5 |
|
5 |
8 |
4 |
4 |
Общего вида POL |
Решение:
Код программы приведен в листинге 2.1.
Результаты работы программы приведены на рис. 2.1.
Листинг 2.1
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
double countF(double x)
{
return pow(x,0.5)-pow(cos(x),2);
}
int main()
{
int n = 4;
int m = 4;
double a = 5;
double b = 8;
double X[21];
double Y[21];
double L[21];
double D[21];
double c[21];
double a1[21][21];
double d;
for(int t = 1;t <= 21;t++)
{
X[t] = 0; Y[t] = 0; L[t] = 0; D[t] = 0;
}
cout<<"The values of x,y:"<<endl;
for(int i = 1;i <= 4;i++)
{
X[i] = a + (i - 1)*(b - a)/(m - 1);
Y[i] = countF(X[i]);
cout<<"x["<<i<<"]="<<X[i]<<"\t\t";
cout<<"y["<<i<<"]="<<Y[i]<<endl;
}
for(int k = 1;k <= n;k++)
{
a1[k][1]=1;
int i=0;
for(int s = 2;s <= n;s++)
{
i=i+1;
if(i==k)
{
i=i+1;
}
d=X[k]-X[i];
a1[k][s]=a1[k][s-1]/d;
for(int j = s-1;j >= 2;j--)
{
a1[k][j]=(a1[k][j-1]-a1[k][j]*X[i])/d;
}
a1[k][1]=-a1[k][1]*X[i]/d;
}
}
for(int i = 1;i <= n;i++)
{
c[i]=0;
for(int k = 1;k <= n;k++)
{
c[i]=c[i]+a1[k][i]*Y[k];
}
}
for(int j = 1; j <= 21; j++)
{
X[j]=a+(j-1)*(b-a)/20;
Y[j]=countF(X[j]);
L[j]=c[1]+X[j]*(c[2]+X[j]*(c[3]+X[j]*c[4]));
D[j]=fabs(Y[j]-L[j]);
}
cout<<endl;
for(int i = 1;i <= 21;i++)
{
cout<<fixed<<"X["<<i<<"]="<<X[i]<<"\t";
cout<<"Y["<<i<<"]="<<Y[i]<<"\t";
cout<<"L["<<i<<"]"<<"="<<L[i]<<"\t";
cout<<"D["<<i<<"]"<<"="<<D[i]<<endl;
}
return 0;
}
Рис. 2.1