Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdar všichni! Kdyby se někdo nudil a prostě musí programovat, jelikoý bez toho nemůže žít tak tady mám pro něj jeden příklad na matice:
Vytvořte třídu Matrix, která bude představovat matici typu n/m, čili o n řádcích a m sloupcích a bude obsahovat metody umožňující operace s touto maticí. Při vypracování se držte následujících pokynù:
1. Vhodně zvolte konstruktory. Matici lze vytvořit na základě znalostí jejího typu, na základě existujícího dvojrozměrného pole nebo jako kopii již
existující instance matice.
2. Prvky matice budou typu double.
3. Vaše třída bude obsahovat tři statické metody, které budou sloužit k vytvoření speciálních typù matic:
ones() { vytvoří matici obsahující samé jedničky,
unity () { jednotková matice (jediné nenulové prvky jsou jedničky na hlavní diagonále),
random() { matice náhodných èísel z intervalu h0; 1i.
Ve všech třech případech budou mít metody vhodné parametry, určující dimenzi matice.
4. Další metody budou představovat běžné úkony, které jsme schopni s maticemi provádět. První operand představuje instance sama, druhý operand, pokud je potřeba, předávejte metodě jako parametr, výsledky budou metody vracet jako novou instanci třídy Matrix:
transpozice matice,
sčítání a odčítání matic,
násobení matic,
porovnání matic (zda se rovnají odpovídající prvky matic),
výpis prvkù matice v přehledné podobě,
determinant matice.
5. Vytvořte metodu, která na základě Gaussovy eliminace (GE) převede matici na horní trojúhelníkový tvar. Této úpravy využijte v metodě pro vý-
počet determinantu matice. Připomeňme, že postup GE souvisí s elementárními řádkovými úpravami, pomocí nichž nulujeme prvky pod hlavní
diagonálou.
6. Implementujte metodu pro výpočet LU rozkladu dané matice.
Poznámky
Při výpočtu determinantu pamatujte na to, že determinant určujeme u čtvercové matice. Při výpočtu GE budete používat elementární řádkové úpravy { záměna dvou řádkù matice, vynásobení řádku nenulovou konstantou a přičtení násobku jednoho řádku k jinému. Je tedy zřejmì výhodné tyto implementovat do vlastních metod.
Při GE by mohlo docházet k velkým zaokrouhlovacím chybám, proto implementujte GE s částečným výběrem hlavního prvku. Hlavním prvkem
se zvolí vždy prvek s největší absolutní hodnotou v příslušném sloupci. GE je obecný převod matice na horní trojúhelníkovou či diagonální matici.
Což ještì neznamená, že musíte řešit soustavu rovnic. A z toho plyne, že by tato metoda měla fungovat na všechny matice. V případì čtvercové ji
můžete použít pro výpočet determinantu.
Neuvažujte špatnou podmíněnost matice, tzn. hlavní prvky matice nebudou blízké nule.
Offline
Až do tvého druhého příspěvku jsem doufal, že si to sem vložil jen tak. Jako abychom snad nezakrněli, prostě jako takovou zajímavou úlohu (i když nevím, co zajímavého bychom na tom našli). Ale ty to chceš celé v podstatě vypracovat...bod 4 v pravidlech fóra si jistě četl...Takže jak bys to řešil?
Offline
Nechci aby mi to tu cele nekdo napsal to ani nesmim protoze to musim pochopit takze ne akorat kdyby nekdo vedel jak udelat tu Gausovu eliminaci byl bych mu vdecen. Vypracovat to cele vazne nechci. S temi zakladnimi operacemi jako je +-* si poradim bezproblemu akorat tu Gausovku vazne nevim jak
Offline
Jak už bylo řečeno, snažíme se pomocí elementárních úprav na matici dostat horní trojúhelníkový tvar. To je takový tvar, který má pod hlavní diagonálou (prvky hlavní diagonály mají x-ovou i y-ovou souřadnici stejnou) samé 0. Toho se dosáhne násobením a sčítáním řádků a třeba prohazováním jednotlivých řádků. Na internetu můžeš najít spoustu materiálů na toto téma, viz. třeba http://cs.wikipedia.org/wiki/Gaussova_e … %AD_metoda Tady jsem našel nějakou implementaci v Javě http://moon.felk.cvut.cz/~pjv/Jak/_math/m058/src/ moc jsem to nezkoumal, takže doufám, že to funguje.
Offline

↑ zlamal89:
Já mam (toho GEA) implementaci v c++ (resp. C, výpis se dá snadno přepsat), kdyby jsi chtěl.
Offline
↑ gladiator01:
Kdyby si byl tak hodny a hodil ho sem nebo na mail Harryhav@seznam.cz
diky moc
Offline

#include<iostream>
#include<math.h>
#include<iomanip>
#define N 4
#define M 5
using namespace std;
void GEA(float a[N][M])
{
int max=0;
float pom;
for(int i=0; i<N; i++) //nalezení pivota
{
for(int j=i+1; j<N; j++)
if(fabs(a[j][i])>fabs(a[i][i]))
max=j;
for(int k=i; k<M; k++)
{
pom=a[i][k];
a[i][k]=a[max][k];
a[max][k]=pom;
}
for(int j=i+1; j<N; j++)
for(int k=N; k>=i; k--)
a[j][k]= a[j][k] - a[i][k] * a[j][i] / a[i][i];
}
//výpis
for(int i=0; i<N; i++)
{//vypisuje prvky, když dojde na konec řadky, odřádkuje
for(int j=0; j<M-1; j++)
{
cout << setprecision(2) << setw(6) << a[i][j] << " ";
if(j==N-1)
{
cout << endl;
}
}
}
}
int main()
{
int i,j,k,l=1;
// Inicializace matice A
//11,12,13,14, 21,22,23,24, 31,32,33,34, 41,42,43,44
float A[N][M]={{5, 2, 3, 4},{3, 6, 7, 8},{1, 10, 5, 12},{0, 14, 15, 16}};
//VÝPIS MATICE --------------------------------------------------------------
cout << "Matice A:" << endl;
for(i=0; i<N; i++)
{//vypisuje prvky, když dojde na konec řadky, odřádkuje
for(j=0; j<M-1; j++)
{
cout << setw(3) << A[i][j] << " ";
if(j==N-1)
{
cout << endl;
}
}
}
cout << endl;
GEA(A);
cout << endl;
system("pause");
return 0;
}Offline
↑ gladiator01: No možná to funguje, ale je to napsaný tak, jak se to psát nemá. Je to humus bez ukazatelů. Tady mám příklad, co jsme nedávno dělali ve škole pro operace s dvěmi maticemi. Už prostě od jisté doby nemohu snést GLOBÁLNÍ proměnné. Velice názorné:
#include <stdlib.h>
#include <stdio.h>
#define MATRIX_SIZE 3
typedef double TMatrix[MATRIX_SIZE][MATRIX_SIZE];
void readMatrix(TMatrix* matrix);
void add(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2);
void sub(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2);
void printMatrix(const TMatrix* matrix);
int main(int argc, char** argv) {
TMatrix A, B, C;
printf("Matice A:\n");
readMatrix(&A);
printf("Matice B:\n");
readMatrix(&B);
add(&C, &A, &B);
printMatrix(&C);
system("PAUSE");
return (EXIT_SUCCESS);
}
void readMatrix(TMatrix* matrix) {
for(int i = 0; i < MATRIX_SIZE; i++) {
for(int j = 0; j < MATRIX_SIZE; j++) {
printf("Pozice %d %d: ", i, j);
scanf("%lf", matrix[i][j]);
}
}
}
void add(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2) {
for(int i = 0; i < MATRIX_SIZE; i++) {
for(int j = 0; j < MATRIX_SIZE; j++) {
*matrix[i][j] = *matrix1[i][j] + *matrix2[i][j];
}
}
}
void sub(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2) {
for(int i = 0; i < MATRIX_SIZE; i++) {
for(int j = 0; j < MATRIX_SIZE; j++) {
*matrix[i][j] = *matrix1[i][j] - *matrix2[i][j];
}
}
}
void printMatrix(const TMatrix* matrix) {
for(int i = 0; i < MATRIX_SIZE; i++) {
for(int j = 0; j < MATRIX_SIZE; j++) {
printf("Pozice %d %d = %f\n", i, j, *matrix[i][j]);
}
}
}Offline

↑ RePRO:
Proč to psát jednoduše, když to jde složitě, co? Mě se zase nelíbí ta tvoje šílenost. A nedělej chytrýho, to co jsem napsala je podle knížky a autor je určitě lepší programátor než ty.
Můžu se zeptat jak dlouho se učíš programovat?
Offline
↑ gladiator01: Pro malej projekt se to dá použít, ale jenom se snažím poradit, že to není optimální. Ne, že to nefunguje, to jsem nenapsal. Já mám programování a logické uvažování rád, proto si vždy musím trošku rejpnout. Neznamená to nic špatného proti Tvé osobě. Učím programovat? Dlouho. Nejraději mám PHP, C++ už není má silná stránka.
Offline

↑ zlamal89:
To vy jste sem přišel s prosbou, tak, prosím, vynechte nějaké ostřejší hodnocení.
Offline

↑ zlamal89:
To je teda vděk, buď rád, že ti je někdo ochoten pomoci.
To miluji, takovéhle experty, kteří žádají o pomoc a pak kritizují. Proč ses ptal když jseš tak chytrý?
↑ halogan:
Děkuji.
Offline
↑ gladiator01: ↑ halogan: Dle mého tím "humusem" mohl zlamal89 myslet i chování některých v tomto vlákně, ne uvedený kód. Doufám, že se nepletu.
Offline

↑ septolet:
ty jseš teda optimista, :) spíš se opičil po RePRO
Offline
↑ gladiator01: V tomhle asi optimista jsem. Moc mi totiž nejde do hlavy, proč by někdo žádal o radu a po odpovědi nám vynadal. To mi přijde strašně divné, proto se v tom snažím najít i jiné vysvětlení. No uvidíme, třeba to zlamal89 nějak vysvětlí.
Offline

↑ zlamal89:
Tak to sory, máš se pořádně vyjdřovat.
Offline
↑ gladiator01:
Nikdy neurazim nekoho kdo se mi snazi pomoct to bych byl potom pitomec
Offline