Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 1 |

 

  Вопрос: Честно говоря не олимпиада, но.... кое чего похуже Добавлено: 01.06.05 20:27  

Автор вопроса:  psinetron | ICQ: 218945948 
Блин, препод задал задачку составить программу для решения линейных уравнений методом Гаусса. Я не прошу составлять такой-же, но может у кого-то уже имеется подобный?
Собственно мне нужен хотябы алгоритм, для решения на Бэйсике. Во как! и еще, матрица может быть разная, от 3х3 до NxN . Помогите пожалуйста, если я ее не здам, 5 на экзамене ни светит :(((

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 02.06.05 05:27
Sub Гаусс()
    Dim Matrix(1 To 4, 1 To 5) As Variant, DLine(1 To 5) As Variant, Answer(1 To 4) As Variant, Main As Variant
    
    For i = 1 To 4
        For j = 1 To 5
            Matrix(i, j) = Worksheets("Гаусс";).Cells(i + 1, j + 1).Value
        Next
    Next

    For i = 1 To 4 'строка
        Main = Matrix(i, i)
        For x = 1 To 5
            Matrix(i, x) = Matrix(i, x) / Main
        Next
        'i-ю строку умножить на нижеслед(1) и прибавить к ней
        For j = i + 1 To 4 'строка
            For x = 1 To 5 'столбец
                ;DLine(x) = Matrix(i, x) * Matrix(j, i)
            Next
            For x = 1 To 5
                Matrix(j, x) = Matrix(j, x) - DLine(x)
            Next
        Next
            
    Next i
     
    For i = 4 To 1 Step -1
        PreSum = 0
        If i < 4 Then
            For j = i + 1 To 4
                PreSum = PreSum + Answer(j) * Matrix(i, j)
            Next
        End If
        Answer(i) = (Matrix(i, 5) - PreSum) / Matrix(i, i)
    Next
               
    Worksheets("Гаусс";).Range("b7:f10";).Value = Matrix
    Worksheets("Гаусс";).Range("b12:e12";).Value = Answer
End Sub


Писал под эксель, и очень давно, и ничё исправлять не хочу, ибо лень... На любой размер матрицы переделай сам, ибо нефиг делать.

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 02.06.05 23:25
Совсем недавно постил метод Гаусса (с выборкой главного элемента, кстати, а не как здесь) для любого порядка, и именно на VB. Вот вам еще раз:
Private Function Gauss(a() As Double, b() As Double, n As Long) As Double()
    Dim res() As Double
    ReDim res(n - 1)
    For i = 0 To n - 2
        Max = i
        For j = i + 1 To n - 1
            If Abs(a(i, j)) > Abs(a(i, Max)) Then Max = j
        Next
        For j = 0 To n - 1
            Swap a(j, Max), a(j, i)
        Next
        Swap b(Max), b(i)
        For j = i + 1 To n - 1
            q = a(i, j) / a(i, i)
            For k = 0 To n - 1
                a(k, j) = a(k, j) - a(k, i) * q
            Next
            b(j) = b(j) - b(i) * q
        Next
    Next
    For i = n - 1 To 0 Step -1
        For j = i + 1 To n - 1
            b(i) = b(i) - a(j, i) * b(j)
        Next
        b(i) = b(i) / a(i, i)
    Next
    Gauss = b
End Function

Private Sub Swap(a, b)
    t = a
    a = b
    b = t
End Sub

И на всякий случай на C++

void swap(double *a1, double *a2){
double t;
t = *a1;
*a1 = *a2;
*a2 = t;
}

int linsys (int n, double a[][10], double b[], double x[];)
{
int i, j, k, max;
double q;
for(i=0; i<n-1; i++){
max = i;
for(j=i+1; j<n; j++) if(fabs(a[j][i];) > fabs(a[max][i];)) max = j;
for(j=0; j<n; j++) swap(&a[max][j], &a[i][j];);
swap(&b[max], &b[i];);
for(j=i+1; j<n; j++){
if(a[i][i] == 0) return 0;
q = a[j][i]/a[i][i];
for(k=0; k<n; k++) a[j][k] = a[j][k]-a[i][k]*q;
b[j] = b[j]-b[i]*q;
}
}
for(i=n-1; i>=0; i--){
for(j=i+1; j<n; j++) b[i] = b[i]-a[i][j]*b[j];
if(a[i][i] == 0) return 0;
b[i] = b[i]/a[i][i];
}
for(i=0; i<n; i++) x[i] = b[i];

return 1;
}

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам