Rząd ukł. równań liniowych, macierze.

0

Witam!
Mam do napisania taki program: Napisać program rozwiązujący układ równań liniowych A*x = B stopnia co najwyżej czwartego. Dane do programu powinny być podane w następującej postaci: rząd równania, kolejne wiersze macierzy współczynników, A, a następnie kolumna wyrazów wolnych, B.

Mam taki oto kod. Problem jest to żeby ogólnie poprawić ten kod by działał pod C. Z góry dziękuję :)

 #include <stdlib.h>
#include <stdio.h>



int main()
{
    int n,k,w,i; //n-ilosc rownan, k - kolumny w tablicy, w - wiersze w tablicy
    double **mg; //mg - wskaznik do macierzy glownej
    double *mw; //mw wskaYnik do macierzy wyrazów wolnych


    printf("Podaj rzad rownania\n");
    scanf("%d",&n);
    k=n; w=n; //ilosc kolumn i wierszy macierzy glownej jest rowna ilosci danych rownan
    mg=malloc double[w];
    for(i=0;i<w;i++) mg[i]=new double[k]; //rezerwuje miejsce w pamieci na macierz glowna
    mw=new double [w]; //rezerwuje miejsce w pamieci na macierz wyrazow wolnych
    printf("Podaj kolejne wspolczynniki przy zmiennych, a nastepnie wyraz wolny wedlug wzoru dla dwoch rownan:\n a1 b1 c1 \n a2 b2 c2\n");
    for (w=0;w<n;w++) //wczytuje kolejne wierze macierzy glownej
    {
        for (k=0;k<n;k++) scanf("%lf",&mg[w][k]); //wczytuje kolejne kolumny macierzy glownej dla wskazanego wiersz
        scanf("%lf",&mw[w]); // wczytuje wyraz wolny dla wskazanego wiersza
    }

    for (w=0;w<n;w++) //wczytuje kolejne wierze macierzy glownej
    {
        for (k=0;k<n;k++) printf("%5.0lf ", mg[w][k]); //wczytuje kolejne kolumny macierzy glownej dla wskazanego wiersza
        printf("%5.0lf \n", mw[w]); // wczytuje wyraz wolny dla wskazanego wiersza
    }
    getchar();
    return 0;
}
0

poczytać o malloc i free:
http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/
http://www.cplusplus.com/reference/clibrary/cstdlib/free/
i przerobić.
Z tym że masz tu tylko i wyłącznie wczytywanie.

0

Mam rozwiązanie tego zadania metoda Gaussa. Gdzie najlepiej wstawic warunek dla n>4 zeby nie wykonywalo.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>

/*
Obliczanie wyznacznika metodą eliminacji Gaussa
*/

double det(int n,double** a);

int main(){
char ch;
int i,j,n;
double** a;
do{
printf("Podaj n=");
scanf("%d",&n);
a=(double**)malloc((n+1)*sizeof(double));

for(i=1;i<=n;i++)
a[i]=(double*)malloc((n+1)*sizeof(double));
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("A[%d][%d]=",i,j);
scanf("%lf",&a[i][j]);
}
printf("\n");
}
printf("det(A)=%lf\n",det(n,a));
for(i=1;i<=n;i++)
free(a[i]);
free(a);
ch=getch();
}
while (ch!=27);
return 0;
}

double det(int n,double** a){
int i,j,k,wm;
double p,w=1.0,max;
for (i=1;i<n;i++){
  max=fabs(a[i][i]);
        wm=i;
for(j=i+1;j<=n;j++)
  if(fabs(a[j][i])>max){
        max=fabs(a[j][i]);
        wm=j;
  }
 if(wm>i) {
  for(k=i;k<=n;k++){
        p=a[i][k];
  a[i][k]=a[wm][k];
a[wm][k]=p;
  }
 w*=-1;
 }
 if (a[i][i]==0) w=0;
 if (w!=0)
 for(j=i+1;j<=n;j++){
        p=(double)a[j][i]/a[i][i];
  for(k=n;k>i;k--)
  a[j][k]-=p*a[i][k];
 }
 w*=a[i][i];
 }
 w*=a[n][n];
 return w;
}
 
0

I chcesz powiedzieć że ten program rozwiązuje układ równań?

1 użytkowników online, w tym zalogowanych: 0, gości: 1