|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
21.10.2010, 23:05 | #1 |
Пользователь
Регистрация: 09.10.2010
Сообщений: 10
|
отладка программы
здравствуйте Гении
помогите пожалуйста тупице исправить глюк в программе суть вводится 2 матрицы a и y затем находится at-транспонированная а затем ata-это перемножение at и a затем обратная от аta затем эта обратная умножается на at получаем матрицу ataat а затем еее умножаем на вектор(матрицу с ku строк и 1 столбцом) так вот вроде бы все норм на этапе подсчета ataat программа считает хрен знает что((( пожалуйста помогите разобраться если кто готов помочь отпишитесь я код куда нить скину |
22.10.2010, 11:52 | #2 |
пыжашийся нуб
Пользователь
Регистрация: 19.06.2010
Сообщений: 93
|
Это настолько секретный код, что его нельзя выложить прямо тут?
|
22.10.2010, 15:21 | #3 |
Форумчанин
Регистрация: 05.12.2009
Сообщений: 253
|
Сюда и бросай. У меня по математике куча подобных заданий лень ручками считать, проще и интереснее написать код.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
|
22.10.2010, 22:53 | #4 |
Пользователь
Регистрация: 09.10.2010
Сообщений: 10
|
#include <vcl.h>
#include <stdlib.h> #include <math.h> #include <values.h> #pragma hdrstop #include "TrC.h" bool E_1(float *buf, int col); void changerow(float *buf, int i, int j, int col); void matrumn(float **q,float **w,float **r,int size); #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int ku=0;//количество узлов float **a; float *y; float *x; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {} void __fastcall TForm1::Button1Click(TObject *Sender) { if(a) { for(int i;i<ku;++i) delete [] a[i]; delete [] a; } if(y) delete y; if(x) delete x; ku=StrToInt( Edit1->Text); StGA->RowCount=ku; StGA->ColCount=ku; StGY->RowCount=ku; StGX->RowCount=ku; GrBA->Visible=true; GrBY->Visible=true; for (int i=0; i<ku; i++) for (int j=0; j<ku; j++) StGA->Cells[i][j]=IntToStr(0); for (int i=0; i<ku; i++) StGY->Cells[0][i]=IntToStr(0); a=new float *[ku]; for (int i=0; i < ku; i++) a[i]=new float [ku]; y=new float [ku]; x=new float [ku]; } //возвращает false, если не может найти обр. матрицу bool E_1(float **a, int col) { float *buf = new float[col*col]; for(int i=0;i<ku;++i) for(int j=0;j<ku;++j) buf[i*col+j]=a[i][j]; float *resbuf = new float[col*col]; /*buf и resbuf - матрицы размером row-строк на col-столбцов это одномерные массивы, доступ к элементу (i,j) - типа buf[i*col+j] buf - заданная матрица, resbuf - выходная такого же размера (сначала она единичная) */ for(int i=0;i<col;++i) for(int j=0;j<col;++j) { if(i==j) resbuf[i*col+j] = 1.; else resbuf[i*col+j] = 0.; } float del,mul; //Идем вниз for(int f, i=0; i<col; ++i) { f=col-1; while( fabs(buf[i*col+i])<=MINFLOAT ) // <=> while( buf[i*col+i]==0 ) {//диагональный элемент равен 0 if(f==i) return false; // ошибка: линейно-зависимая матрица; //переставляем строки, пока не найдем с ненулевым элементом changerow(buf, i, f, col); changerow(resbuf, i, f--, col); } del = buf[i*col+i]; if( fabs(del - 1.)>MINFLOAT ) // <=> if( del!=1 ) { buf[i*col+i] = 1.; for(int j=i+1; j<col; ++j) buf[i*col+j] /= del; for(int j=0; j<col; ++j) resbuf[i*col+j]/=del; } for(int k=i+1; k<col; ++k) { if( fabs(buf[k*col+i])>MINFLOAT ) // <=> if(buf[k*col+i]!=0.) { mul = buf[k*col+i]; buf[k*col+i] = 0.; for(int j=i+1; j<col; ++j) buf[k*col+j] -= mul*buf[i*col+j]; for(int j=0; j<col; ++j) resbuf[k*col+j] -= mul*resbuf[i*col+j]; } } } //идем вверх for(int i=col; --i>=0; ) { for(int k=i; --k>=0; ) { if( fabs(buf[k*col+i])>MINFLOAT) // <=> if(buf[k*col+i]!=0.) { mul = buf[k*col+i]; buf[k*col+i] = 0.; for(int j=0; j<col; ++j) resbuf[k*col+j] -= mul*resbuf[i*col+j]; } } } for(int i=0;i<col;++i) for(int j=0;j<col;++j) a[i][j]=resbuf[i*col+j]; return true; } //меняет строки i и j местами void changerow(float *buf, int i, int j, int col) { int sz = sizeof(float)*col; float *help = new float[sz]; memcpy(help, &buf[i*col], sz); memcpy(&buf[i*col], &buf[j*col], sz); memcpy(&buf[j*col], help, sz); delete help; } void matrumn(float **q,float **w,float **r,int size) { for(int i = 0; i < size; i++) for(int j = 0; j < size; j++) { r[i][j] = 0; for(int k = 0; k < size; k++) r[i][j] += (q[i][k] * w[k][j]); } } void __fastcall TForm1::Button2Click(TObject *Sender) { GrBX->Visible=true; for (int i=0; i<ku; i++) y[i]=StrToFloat(StGY->Cells[0][i]); for (int i=0; i<ku; i++) for (int j=0; j<ku; j++) a[i][j]=StrToFloat( StGA->Cells[i][j]); float **at; at=new float *[ku]; for (int i=0; i < ku; i++) at[i]=new float [ku]; for (int i=0; i<ku;i++) for(int j=0;j<ku;j++) at[i][j]=a[j][i]; float **ata; ata=new float *[ku]; for (int i=0; i < ku; i++) ata[i]=new float [ku]; matrumn(at,a,ata,ku); if(E_1(ata, ku)) { float **ataat; ataat=new float *[ku]; for (int i=0; i < ku; i++) ataat[i]=new float [ku]; for(int i = 0; i < ku; i++) for(int j = 0; j < ku; j++) { ataat[i][j]=0; for(int k = 0; k < ku; k++) ataat[i][j] += ((at[i][k]) * (ata[k][j])); } for (int i=0; i<ku;i++) for(int j=0;j<ku;j++) StG1->Cells[i][j]=ataat[i][j]; for(int i = 0; i < ku; i++) { x[i] = 0; for(int k = 0; k < ku; k++) x[i] += (ataat[i][k] * y[k]); } for (int i=0; i<ku; i++) StGX->Cells[0][i]=FloatToStrF(x[i],ffNumber, 1, 1); for(int i;i<ku;++i) delete [] ataat[i]; delete [] ataat; } else for (int i=0; i<ku; ++i) for (int j=0; j<ku; ++j) StGA->Cells[i][j]="NULL"; for(int i;i<ku;++i) delete [] at[i]; delete [] at; for(int i;i<ku;++i) delete [] ata[i]; delete [] ata; } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
отладка программы | tanek | Помощь студентам | 3 | 01.04.2010 21:52 |
Отладка программы в с++ | immor | Общие вопросы C/C++ | 2 | 31.05.2009 21:56 |
отладка программы | honest | Помощь студентам | 1 | 18.03.2009 06:58 |
Отладка программы | lenuxoid | Общие вопросы Delphi | 1 | 22.12.2008 19:29 |
Отладка программы | ЭД4-0014 | Помощь студентам | 0 | 06.06.2008 21:21 |