2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Решение СЛАУ. С#
Сообщение25.10.2009, 22:25 


01/05/09
22
Помогите, пожалуйста, с методом решения СЛАУ на c#.
Работа идет с массивом (n+1)xn, где в n+1 столбце вектор свободных значений.
Пытался приводить к треугольному виду, но не работает, не понял, почему:
//ap1 - сам массив
double buf;
for (int k = 0; k < n; k++)
for (int j = k + 1; j <= n; j++)
{
buf = -ap1[k, j] / ap1[k, k];
for (int i = k; i <= n + 1; i++)
ap1[i, j] = ap1[i, k] * buf + ap1[i, j];
}
Числа в массиве бывают до 10го порядка. Посоветуйте с приведением к 3-угольной что-нибудь, либо, возможно, какой-либо другой метод решения слау(более точный:))

 Профиль  
                  
 
 Re: Решение СЛАУ. С#
Сообщение25.10.2009, 23:56 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
Работа идет с массивом (n+1)xn

Обычно строки указывают на первом месте: $n\times(n+1)$. Получается, что вы работаете с транспонированной матрицей. :) Хотя это не так уж и важно (а вот читать невозможно).

Цитата:
Пытался приводить к треугольному виду, но не работает, не понял, почему

Во-первых, кажется, в вашем коде неверно указаны пределы итерирования (например, цикл типа for(int k=0; k<n; k++); сработает ровно $n$ раз). Во-вторых, у вас есть деление, поэтому нужно проверять ситуацию с делением на ноль (при этом можно менять строки местами).

Цитата:
возможно, какой-либо другой метод решения слау

Да полно их, Жордана-Гаусса, Крамера, через $LU$-разложение...

 Профиль  
                  
 
 Re: Решение СЛАУ. С#
Сообщение25.10.2009, 23:58 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Идея в общем правильная, а почему не работает, и где там какой-нибудь off-by-one проскочил - это уж Вам искать.
Более точный метод подразумевает отыскание pivot element, максимального по модулю, а не просто "что первое попалось, то и вычитаем из всех". Но Вы сначала с этим как-нибудь.

 Профиль  
                  
 
 Re: Решение СЛАУ. С#
Сообщение25.10.2009, 23:59 
Заслуженный участник


09/08/09
3438
С.Петербург
1. Если у Вас в последнем столбце свободный член, то массив должен быть $N \times (N+1)$, а не $(N+1)\times N$.
2. Более точным (но не сильно более сложным) является метод Гаусса с выбором ведущего
элемента - на k-м шаге диагонализации переупорядочиваем оставшиеся $N-k$ уравнений таким образом, чтобы первым оказалось уравнение с максимальным по по абсолютной величине k-м коэффициентом.

При постинге кода пользуйтесь тагом code, пожалуйста.

Код:
for (int i = k; i <= n + 1; i++)
    ap1[i, j] = ap1[i, k] * buf + ap1[i, j];

возникает подозрение, что здесь Вы вообще к (N+2)-й строке обращаетесь.
У Вас что, массив с запасом выделен? (Просто непонятно, почему "index out of bounds" не выскакивает).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group