Метод Гаусса-Зейделя для решения нелинейных уравнений

[Решено Спасибо] Я разработал приведенный ниже код на C ++ для решения линейных уравнений с использованием метода Гаусса-Зейделя, но у меня, похоже, возникает проблема во время выполнения при заполнении массивов, которую я не могу понять. Вот мой код …

#include<stdio.h>
int main(void)
{
float a[10][10],b[10],x[10],y[10];
int n=0,m=0,i=0,j=0;
printf("Enter size of 2d array(Square matrix) : ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("Enter values no. %d %d :",i,j);
scanf("%f",&a[i][j]);
}
}
printf("\nEnter Values to the right side of equation\n");
for(i=0;i<n;i++)
{
printf("Enter values no. %d :",i,j);
scanf("%f",&b[i]);
}
printf("Enter initial values of x\n");
for(i=0;i<n;i++)
{
printf("Enter values no. %d :",i);
scanf("%f",&x[i]);
}
printf("\nEnter the no. of iteration : " );
scanf("%d",&m);
while(m>0)
{
for(i=0;i<n;i++)
{
y[i]=(b[i]/a[i][i]);
for(j=0;j<n;j++)
{
if(j==i)
continue;
y[i]=y[i]-((a[i][j]/a[i][i])*x[j]);
x[i]=y[i];
}
printf("x%d = %f    ",i+1,y[i]);
}
printf("\n\n");
m--;
}
return 0;

Заранее спасибо 🙂

0

Решение

Вы не выделяете второе измерение для EquationHolder, Поскольку это двумерная матрица, вы должны также выделить второе измерение. Измени свой двойной for цикл к следующему:

float ** EquationHolder=new float *[3];
for (int i=0; i<NumEquations; i++)
{
EquationHolder[i] = new float[3];
cout<<"Please Enter The Information Of Equation ("<<i+1<<")...\n";
for (int j=0; j<NumEquations; j++)
{
cout<<"X"<<j+1<<": ";
cin>>EquationHolder[i][j];
}
}

Однако я бы порекомендовал использовать std::vector<std::vector<double>> вместо сырых массивов C его гораздо безопаснее.

1

Другие решения

Во-первых:

выделить хранилище для всех массивов:

int NumEquations=3;
// Equation Holder...
float ** EquationHolder= new float *[3];
for (int i=0; i<NumEquations; i++)
{
EquationHolder[ i] = new float[3];
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cout<<"Please Enter The Information Of Equation ("<<i+1<<")...\n";
for (int j=0; j<NumEquations; j++)
{
cout<<"X"<<j+1<<": ";
cin>>EquationHolder[i][j];
}
}

Дополнительно были ошибки в основной процедуре:

#include <iostream>
using namespace std;

void GaussSeidel(int Iterations, float **EquationHolder,
float *EquationResultHolder) {
int InitialGuess = 0;
float x1 = 0, x2 = 0, x3 = 0;
while (InitialGuess < Iterations) {
x1 = (1 / EquationHolder[0][0])* (EquationResultHolder[0]-
((EquationHolder[0][1]) * x2)-((EquationHolder[0][2]) * x3));
x2 = (1 / EquationHolder[1][1])*(EquationResultHolder[1]-
((EquationHolder[1][0]) * x1)-((EquationHolder[1][2]) * x3));
x3 = (1 / EquationHolder[2][2])*((EquationResultHolder[2]-
((EquationHolder[2][0]) * x1)-((EquationHolder[2][1]) * x2)));
InitialGuess += 1;
cout << "---------------------Iteration #" << InitialGuess
<< "---------------------" << std::endl;
cout << "X1: " << x1 << "\t" << x2 << "\t" << x3 << std::endl;
}
}

использование:

int main() {
int NumEquations = 3;
// Equation Holder...
float ** EquationHolder = new float *[3];
for (int i = 0; i < NumEquations; i++) {
EquationHolder[ i] = new float[3];
cout << "Please Enter The Information Of Equation(" << i + 1 << ")...\n";
for (int j = 0; j < NumEquations; j++) {
cout << "X" << j + 1 << ": ";
cin >> EquationHolder[i][j];
}
}
//... as before

for ( int i = 0; i < NumEquations; i++) {   // deallocate storage
delete [] EquationHolder[ i];
}
delete [] EquationHolder;

return 0;
}

выход:

(…)

Пожалуйста, введите необходимые итерации: 9

———————Итерация № 1 ———————

X1: 4 -2 1,42857

———————Итерация № 2 ———————

X1: 4,14286 -2,83333 2,10204

(…)

———————Итерация № 9 ———————

X1: 3.81631 -3.03054 2.36438

1

Вы не инициализируете строки EquationHolder. Добавь это:

float ** EquationHolder = new float *[3];
for(int i=0; i<NumEquations; i++)     // ADD
EquationHolder[i] = new float[3]; // ADD

Кроме того, я рекомендую вам использовать двойной вместо поплавок (двойной гораздо точнее, и менее уязвимы для числовых ошибок).

0
По вопросам рекламы [email protected]