ЛБ4 / Лабораторная работа4 Люда
.docxМинистерство образования РБ
УО «Брестский государственный университет имени А.С. Пушкина»
Математический факультет
Кафедра информатики и прикладной математики
Лабораторная работа № 4
Тема: «Метод последовательных приближений решения интегрального уравнения Фредгольма»
Выполнила:
студентка ПМ–31
Викторович Л.В.
Проверила:
Силаева З. Н.
Брест, 2012
Задание
Методом последовательных приближений найти приближенное решение интегрального уравнения Фредгольма второго рода, положив n =4. Проверить выполнение условий сходимости этого метода.
Решение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace MCHA4lb
{
class Program
{
public static double GetNorm(double a, double b)
{
return Math.Pow(a, 2) + Math.Pow(b, 2);
}
public static double[] MultMn(double[] X, double[] Y)
{
double[] result = new double[X.Length + Y.Length - 1];
for (int i = 0; i < result.Length; i++)
{
result[i] = 0;
}
for (int i = X.Length - 1; i >= 0; i--)
{
for (int j = Y.Length - 1; j >= 0; j--)
{
result[i + j] += X[i] * Y[j];
}
}
return result;
}
public static double[] PervObr(double[] X)
{
double[] result = new double[X.Length + 1];
for (int i = 0; i < result.Length; i++)
result[i] = 0;
for (int i = X.Length - 1; i >= 0; i--)
{
result[i + 1] = X[i] / (i + 1);
}
return result;
}
public static double ResIteg(double[] X, double a, double b)
{
double sum = 0;
for (int i = 0; i < X.Length; i++)
{
sum += X[i] * Math.Pow(b, i);
sum -= X[i] * Math.Pow(a, i);
}
return sum;
}
public static double[] SumMn(double[] X, double[] Y)
{
double[] result = new double[X.Length];
for(int i = 0; i < result.Length; i++)
{
result[i] = X[i];
}
for (int i = 0; i < Y.Length; i++)
{
result[i] += Y[i];
}
return result; }
public static double[] SkalMultMn(double[] X, double a) {
double[] result = new double[X.Length];
for (int i = 0; i < result.Length; i++) {
result[i] = X[i] * a; }
return result; }
static void Main(string[] args) {
FileStream s = File.Open("MCHA4input.txt", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(s);
int n = Convert.ToInt32(sr.ReadLine());
double labda = Convert.ToDouble(sr.ReadLine());
string[] str = sr.ReadLine().Split(' ');
double a = 0, b = 1;
str = sr.ReadLine().Split(' ');
List<double[]> listFi = new List<double[]>();
double[] tempFi = new double[str.Length];
Console.WriteLine("{0} < 1 условия сходимости выполняются", labda * (b - a) * GetNorm(a, b));
for (int i = 0; i < tempFi.Length; i++) {
tempFi[i] = Convert.ToDouble(str[i]); }
listFi.Add(tempFi);
str = sr.ReadLine().Split(' ');
double[] kerX = new double[str.Length];
for (int i = 0; i < kerX.Length; i++) {
kerX[i] = Convert.ToDouble(str[i]); }
str = sr.ReadLine().Split(' ');
double[] kerY = new double[str.Length];
for (int i = 0; i < kerY.Length; i++)
{
kerY[i] = Convert.ToDouble(str[i]); }
sr.Close();
s.Close();
for (int i = 1; i <= n; i++)
{
listFi.Add(new double[kerX.Length]);
listFi[i][kerX.Length - 1] = ResIteg(PervObr(tempFi), a, b);
listFi[i][0] = ResIteg(PervObr(MultMn(tempFi, kerY)), a, b);
tempFi = listFi[i];
}
for (int i = 1; i <= n; i++)
{
listFi[i] = SkalMultMn(listFi[i], Math.Pow(labda, i));
listFi[0] = SumMn(listFi[0], listFi[i]);
}
for (int i = listFi[0].Length - 1; i >= 0; i--)
{
if (i != 0)
{
Console.Write("{0} * х ^ {1} + ", Math.Round(listFi[0][i], 4), i);
}
else {
Console.Write("{0} * х ^ {1}", Math.Round(listFi[0][i], 4), i); }
}
Console.ReadKey();
}
}
}