Autor Zpráva
Tin
Profil
Nevíte někdo, jak by vypadal algoritmus na řešení soustavy dvou rovnic o dvou neznámých?
Potřeboval bych takový ty nenormální případy, jako je třeba nekonečně mnoho řešení a tak.
Normální soustava, kde výsledkem je uspořádaná dvojice dvou reálných čísel není žádný problém.
habendorf
Profil
Soustava má nekonečně mnoho řešení, pokud se ti ji podaří upravit na rovnici 0 = 0.
x = y
2x = 2y

Žádné řešení bude mít soustava, kterou upravíš na 0 = 1.
x = y
x = y + 1
Tin
Profil
ale jak to udělat obecným algoritmem, který bych mohl naťukat do Delphi?
DoubleThink
Profil *
Nejjednodušší způsob je Gaussova eliminace.
Rovnice se převedou na rozšířenou matici soustavy A*X=B. Úpravou řádků a sloupcu se převede do trojúhelníkového tvaru. Samozřejmě matice musí být regulární (počet lineárně nezávislých rovnic >= počet neznámých).

Ve škole jsme na to dělali program v C. Snad to pomůže:
#include <stdio.h>

#include <stdlib.h>

void gauss(int n,double **a)
{
int i,j,k;
double pomocna;

for(k=0;k<n-1;k++)
for(j=k+1;j<n+1;j++)
{
pomocna = (a[k][j]/a[k][k]);
for(i=k+1;i<n;i++){
a[i][j]=a[i][j]-pomocna*a[i][k];}
}
}


void zpetny_chod(int n,double **a,double *b)
{
int i,j,k;
double pomocna;

for(i=n-1;i>=0;i--)
{
pomocna=0;
for(j=i+1;j<n;j++){
pomocna+=a[i][j]*b[j];
}
b[i]=(a[i][n]-pomocna)/a[i][i];
}
}

void main()
{
int n,i,j,k;
double **a,*b;

printf("Zadejte velikost ctvercove matice n\n");
scanf("%i",&n);


b = (double*)malloc(n*sizeof(double));

a = (double**)malloc(n*sizeof(double*));
for(i=0;i<n;i++) a[i]=(double*)malloc((n+1)*sizeof(double));


for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
{
printf("Zadejte prvky matice A[%d][%d]\n",i,j);
scanf("%lf",&a[i][j]);
}
}

printf("Zadana matice A je:\n");


for(i=0;i<n;i++){
for(j=0;j<n+1;j++){
printf("%10f ",a[i][j]);
}
printf("\n");
}

gauss(n,a);

printf("Rozsirena matice A|B:\n");

for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++){
zpetny_chod(n,a,b);
if(j<i){
a[i][j]=0;
}
printf("%10f ",a[i][j]);
}
printf("\n");
}

zpetny_chod(n,a,b);

for(i=0;i<n;i++)
{
printf("x(%i) = %lf\n",i,b[i]);
}
}
Mistr
Profil
DoubleThink
Tak sem rovnou opiš Neustupova skripta. :-)
DoubleThink
Profil *
Klidně ;)

ftp://strojovna2.sh.cvut.cz/fsv_mavo.sh.cvut.cz/Matematika/Skripta_mat ika_1/
Toto téma je uzamčeno. Odpověď nelze zaslat.

0