Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
24 слайда
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
87.12 kB
Просмотров:
107
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд
Содержание слайда: ПЯВУ. Лекция 14.
Основы программирования.
А.М. Задорожный
№2 слайд
Содержание слайда: Контрольные вопросы
Почему в C# рекомендуют использовать свойства вместо полей данных?
Что такое рекурсия?
В чем заключается метод Гаусса решения системы линейных уравнений?
Какие варианты решения системы уравнений могут быть?
№3 слайд
Содержание слайда: План лекции
Решение системы уравнений методом Гаусса
Вариант с выбором ведущего элемента
Вычисление детерминанта методом Гаусса
Вычисление числа Пи методом “Монте-Карло”.
№4 слайд
Содержание слайда: Системы линейных уравнений и Матрицы
a11*x1 + a12*x2 + … a1N*xN = b1
a21*x1 + a22*x2 + … a2N*xN = b2
…
aN1*x1 + aN2*x2 + … aNN*xN = bN
В векторном виде:
A*x = b
x = {x1, x2 , … xN}
№5 слайд
Содержание слайда: Метод Гаусса
a’11*x1 + a’12*x2 + … a’1N*xN = b’1
a’22*x2 + … a’2N*xN = b’2
…
a’NN*xN = b’N
№6 слайд
Содержание слайда: Представление системы уравнений
Матрицу представим в виде двумерного массива:
double [,] M = new double[N, N+1];
Число строк матрицы N. Число столбцов N + 1, т.к. включает и свободный вектор b.
…
Заполняем матрицу коэффициентами…
№7 слайд
Содержание слайда: Алгоритм вычитания строк
Здесь k – номер строки, которую надо вычитать …
static void SubtractRow(double [,] M, int k)
{
double m = M[k, k];
for(int i = k+1; i < M.GetLength(0); i++)
{
double t = M[i, k]/m;
for(int j = k; j < M.GetLength(1); j++)
{
M[i, j] = M[i, j] - M[k, j]*t;
}
}
}
№8 слайд
Содержание слайда: Приведение матрицы к верхнетреугольному виду
static void TriangleMatrix(double [,] M)
{
for(int i = 1; i < M.GetLength(0); i++)
SubtractRow(M, i-1);
}
№9 слайд
Содержание слайда: Решение
Последнее уравнение содержит только 1 неизвестное – xN. После решения последнего уравнения, можно решить предпоследнее, т.к. после подстановки xN в нем останется неизвестным только xN-1 и т.д.
public static double [] Solve(double [,] M)
{
TriangleMatrix(M);
double v[] = new double[M.GetLength(0)];
int Nb = M.GetLength(1)-1;
for(int n = v.Length-1; n >= 0; n--)
{
double sum = 0;
for(int i = n+1; i < Nb; i++)
sum += v[i]*M[n, i];
v[n] = (M[n, Nb]-sum)/M[n, n];
}
return v;
}
№10 слайд
Содержание слайда: “Слабые” места
SubtractRow:
double m = M[k, k];
…
M[i, j] = M[i, j] - M[k, j]*t/m;
Возможно, m окажется равным 0!
Возможно окажется неравным 0, в результате ошибок вычислений!
№11 слайд
Содержание слайда: Улучшение метода
Выбор “ведущего элемента”.
Идея заключается в том, что бы каждый раз выбирать из оставшихся строк строку с набольшим элементом в текущей позиции (столбце, который зануляем).
От перестановки уравнений решение системы не изменяется.
№12 слайд
Содержание слайда: Выбор ведущего элемента
//Находит строку, в которой элемент n имеет наибольшее по модулю значение,
// и меняет ее местами со строкой n
static void SelectLeading(double [,] M, int n)
{
//Найдем номер строки, с наибольшим
//элементом в столбце n
int iMax = n;
for(int i = n+1; i < M.GetLength(0); i++)
if(Math.Abs(M[iMax, n]) < Math.Abs(M[i, n]))
iMax = i;
// Переставить строки iMax и n
if(iMax != n)
for(int i =n; i < M.GetLength(1); i++)
{
double t = M[n, i];
M[n, i] = M[iMax, i];
M[iMax, i] = t;
}
}
№13 слайд
Содержание слайда: Усовершенствованная триангуляция матрицы
static void TriangleMatrix(double [,] M)
{
for(int i = 1; i < M.GetLength(0); i++)
{
SelectLeading(M, i-1);
SubtractRow(M, i-1);
}
}
№14 слайд
Содержание слайда: Решение есть не всегда
static bool TriangleMatrix(double [,] M)
{
for(int i = 1; i < M.GetLength(0); i++)
{
SelectLeading(M, i-1);
if(Math.Abs(M[i-1, i-1]) > 0.0001)
SubtractRow(M, i-1);
else
retrun false;
}
return true;
}
№15 слайд
Содержание слайда: Решение
public static double [] Solve(double [,] M)
{
if(!TriangleMatrix(M))
retun null;
double v[] = new double[M.GetLength(0)];
int Nb = M.GetLength(1)-1;
for(int n = v.Length-1; n >= 0; n--)
{
double sum = 0;
for(int i = n+1; i < Nb; i++)
sum += v[i]*M[n, i];
v[n] = (M[n, Nb]-sum)/M[n, n];
}
return v;
}
№16 слайд
Содержание слайда: Решение
double[,] M = new double[4, 5] {
{ 2, 3, 1, 1, 1 }, { 1, 2, 1, 5, 1 },
{ 1, 1, 2, 1, 1 }, { 1, 1, 4, 2, 1 } };
double[]x = Gauss.Solve(M);
if(x != null)
for (int i = 0; i < x.Length; i++)
Console.WriteLine(x[i]);
else
Console.WriteLine(“Единственного решения системы нет.”);
№17 слайд
Содержание слайда: Детерминант и метод Гаусса
Если не применять выбор ведущего элемента, то детерминант – это просто произведение диагональных элементов верхнетреугольной матрицы.
Перестановка строк может приводить к изменению знака.
Если меняются местами строки i и j, то знак будет меняться на противоположенный.
№18 слайд
Содержание слайда: Выбор ведущего элемента
static bool SelectLeading(double [,] M, int n)
{
//Найдем номер строки, с наибольшим
//элементом в столбце n
int iMax = n;
for(int i = n+1; i < M.GetLength(0); i++)
if(Math.Abs(M[iMax, n])
< Math.Abs(M[i, n])
iMax = i;
// Переставить строки iMax и n
if(iMax != n)
{
for(int i =n; i < M.GetLength(1); i++)
{
double t = M[n, i];
M[n, i] = M[iMax, i];
M[iMax, i] = t;
}
return true;
}
return false;
}
№19 слайд
Содержание слайда: Вычисляем детерминант
static double Determinant(double [,] M)
{
double d = 1;
for(int i = 1; i < M.GetLength(0); i++)
{
if(SelectLeading(M, i-1))
d *=-1;
if(Math.Abs(M[i-1, i-1]) > 0.0001)
SubtractRow(M, i-1);
else
retrun 0;
}
for(int i = 0; i < M.GetLength(0); i++)
d*=M[i, i];
return d;
}
№20 слайд
Содержание слайда: Контрольные вопросы
Как в решении задачи проявился характер вычислений с числами с плавающей точкой?
Какие преобразования числовых типов компилятор выполняет сам?
Как преобразовать числовые типы, если компилятор не позволяет неявное преобразование?
№21 слайд
Содержание слайда: Вычисление числа Пи методом “Монте-Карло”
Метод основан на применении для вычислений случайных чисел.
Если моделировать попадание точек в квадрат равномерно по его площади, то доля точек попавших в круг, будет пропорциональна отношению площади круга к площади квадрата.
№22 слайд
Содержание слайда: Вычисление числа Пи
Sокр = Пи*R2
Удобно взять R = 1 и ограничиться 1-ой четвертью математической плоскости.
Sокр = Пи
Площадь квадрата при этом равна 4.
№23 слайд
Содержание слайда: Вычисление Пи
Реализация
int N=1000000;
int n=0;
Double x, y;
Random r = new Random();
for(int i = 0; i < N; i++)
{
x = r.NextDouble(); y = r.NextDouble();
if(x*x + y*y < 1)
n++;
}
Double pi = (4.0 * n) / N;
Console.WriteLine(“Pi = {0:0.###}”, pi);
№24 слайд
Содержание слайда: Вопросы для повторения
В чем особенность статических методов (методов класса) по сравнению с методами объектов?
Какие преимущества ООП дает на примере класса гистограммы?
На какой идее был основан алгоритм определения принадлежности точки полигону?
Как можно вычислить площадь полигона?