2014 dxdy logo

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

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




 
 Решение СЛАУ. С#
Сообщение25.10.2009, 22:25 
Помогите, пожалуйста, с методом решения СЛАУ на 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 
Цитата:
Работа идет с массивом (n+1)xn

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

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

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

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

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

 
 
 
 Re: Решение СЛАУ. С#
Сообщение25.10.2009, 23:58 
Аватара пользователя
Идея в общем правильная, а почему не работает, и где там какой-нибудь off-by-one проскочил - это уж Вам искать.
Более точный метод подразумевает отыскание pivot element, максимального по модулю, а не просто "что первое попалось, то и вычитаем из всех". Но Вы сначала с этим как-нибудь.

 
 
 
 Re: Решение СЛАУ. С#
Сообщение25.10.2009, 23:59 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group