Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Решение системы линейных уравнений с помощъю LU-разложения и обратной матрицы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В массиве найти наибольший и наименьший элемент http://www.cyberforum.ru/cpp-beginners/thread19843.html
Помогите пожалуйста! Найти наибольший и наименьший элемент,их значения и индексы вывести на экран.:(
C++ Помогите разобраться с рекурсией... Здравствуйте, нашел решение задачи "ханойских башен", проблема с пониманием. <...> tn(n,1,2,3); <...> void tn(int n, int i, int j, int w) /* рекурсивная */ { if (n>1) ... http://www.cyberforum.ru/cpp-beginners/thread19840.html
Объясните смысл выражения C++
#include<iostream.h> #include<conio.h> void main(void) { clrscr(); cout<<17%3 ; getch(); clrscr(); }
Найти задачник по языку C++
поздравляю всех с наступающим новым годом! я начинающий программист (т.е. почти ничего не знаю) и мне хотелось бы найти какой нибудь ЗАДАЧНИК чтобы по мере изучения теории с++ я мог бы...
C++ Помогите переделать malloc в realloc! http://www.cyberforum.ru/cpp-beginners/thread19824.html
Нужно что бы распределение памяти было realoc-ом, помогите пожалуйста Красным выделен malloc //---------------------ZADANIE ------------------------- // Dany natural'noe chislo N,...
C++ не используя доп. памяти , найти кол. совподающих значений элементов массива А и В Задача такова: Даны два упорядоченных массива А и В (необязательно одинаковой длины). В каждом из массивов могут быть совподающие элементы. Не используя дополнительной памяти, найти количество... подробнее

Показать сообщение отдельно
natasho
0 / 0 / 0
Регистрация: 27.12.2008
Сообщений: 3

Решение системы линейных уравнений с помощъю LU-разложения и обратной матрицы - C++

27.12.2008, 11:03. Просмотров 2887. Ответов 0
Метки (Все метки)

помогите пожалуйста....Мне нужно решить систему линейних уравнений с помощью этих методов у меня есть коды, но компилятор все время видает ошибки.Буду очень признателна, если мне поможите разобраться в этих кодах....И матрицу Жакобиана я ищу в ручныю-это производние от функций

Код
#include "nrutil.h"
#include <iostream>
#define TINY 1.0e-20;
#define NRANSI
void LU::lubksb(float **a, int n, int *indx, float b[])
{
	int i,ii=0,ip,j;
		float sum;

		for (i=1;i<=n;i++) {
			ip=indx[i];
			sum=b[ip];
			b[ip]=b[i];
			if (ii)
				for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
			else if (sum) ii=i;
			b[i]=sum;
		}
		for (i=n;i>=1;i--) {
			sum=b[i];
			for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j];
			b[i]=sum/a[i][i];
		}
}

void LU::ludcmp(float **a, int n, int *indx, float *d)
{
	int i,imax,j,k;
	float big,dum,sum,temp;
	float *vv;

	vv=vector(1,n);
	*d=1.0;
	for (i=1;i<=n;i++) {
		big=0.0;
		for (j=1;j<=n;j++)
			if ((temp=fabs(a[i][j])) > big) big=temp;
		if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
		vv[i]=1.0/big;
	}
	for (j=1;j<=n;j++) {
		for (i=1;i<j;i++) {
			sum=a[i][j];
			for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];
			a[i][j]=sum;
		}
		big=0.0;
		for (i=j;i<=n;i++) {
			sum=a[i][j];
			for (k=1;k<j;k++)
				sum -= a[i][k]*a[k][j];
			a[i][j]=sum;
			if ( (dum=vv[i]*fabs(sum)) >= big) {
				big=dum;
				imax=i;
			}
		}
		if (j != imax) {
			for (k=1;k<=n;k++) {
				dum=a[imax][k];
				a[imax][k]=a[j][k];
				a[j][k]=dum;
			}
			*d = -(*d);
			vv[imax]=vv[j];
		}
		indx[j]=imax;
		if (a[j][j] == 0.0) a[j][j]=TINY;
		if (j != n) {
			dum=1.0/(a[j][j]);
			for (i=j+1;i<=n;i++) a[i][j] *= dum;
		}
	}
	free_vector(vv,1,n);
}
#undef TINY
#undef NRANSI

Inverse of matrixe
float **a,**y,d,*col;
int i,j *index;
ludcmp(a,N,indx,&d);
for(j=1;j<=N;j++)
 {
    for (i=1;i<=N;i++)
        col[i]=0.0;
       col[j]=1.0;
       lubksb(a,N,indx,col);
       for(i=1;i<=N;i++) y[i][j]=col[i];
 }


#ifndef _NR_UTILS_H_
#define _NR_UTILS_H_

static float sqrarg;
#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg)

static double dsqrarg;
#define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg)

static double dmaxarg1,dmaxarg2;
#define DMAX(a,b) (dmaxarg1=(a),dmaxarg2=(b),(dmaxarg1) > (dmaxarg2) ?\
        (dmaxarg1) : (dmaxarg2))

static double dminarg1,dminarg2;
#define DMIN(a,b) (dminarg1=(a),dminarg2=(b),(dminarg1) < (dminarg2) ?\
        (dminarg1) : (dminarg2))

static float maxarg1,maxarg2;
#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\
        (maxarg1) : (maxarg2))

static float minarg1,minarg2;
#define FMIN(a,b) (minarg1=(a),minarg2=(b),(minarg1) < (minarg2) ?\
        (minarg1) : (minarg2))

static long lmaxarg1,lmaxarg2;
#define LMAX(a,b) (lmaxarg1=(a),lmaxarg2=(b),(lmaxarg1) > (lmaxarg2) ?\
        (lmaxarg1) : (lmaxarg2))

static long lminarg1,lminarg2;
#define LMIN(a,b) (lminarg1=(a),lminarg2=(b),(lminarg1) < (lminarg2) ?\
        (lminarg1) : (lminarg2))

static int imaxarg1,imaxarg2;
#define IMAX(a,b) (imaxarg1=(a),imaxarg2=(b),(imaxarg1) > (imaxarg2) ?\
        (imaxarg1) : (imaxarg2))

static int iminarg1,iminarg2;
#define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ?\
        (iminarg1) : (iminarg2))

#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))

#if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */

void nrerror(char error_text[]);
float *vector(long nl, long nh);
int *ivector(long nl, long nh);
unsigned char *cvector(long nl, long nh);
unsigned long *lvector(long nl, long nh);
double *dvector(long nl, long nh);
float **matrix(long nrl, long nrh, long ncl, long nch);
double **dmatrix(long nrl, long nrh, long ncl, long nch);
int **imatrix(long nrl, long nrh, long ncl, long nch);
float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
	long newrl, long newcl);
float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch);
float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh);
void free_vector(float *v, long nl, long nh);
void free_ivector(int *v, long nl, long nh);
void free_cvector(unsigned char *v, long nl, long nh);
void free_lvector(unsigned long *v, long nl, long nh);
void free_dvector(double *v, long nl, long nh);
void free_matrix(float **m, long nrl, long nrh, long ncl, long nch);
void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch);
void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch);
void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch);
void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch);
void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch,
	long ndl, long ndh);

#else /* ANSI */
/* traditional - K&R */

void nrerror();
float *vector();
float **matrix();
float **submatrix();
float **convert_matrix();
float ***f3tensor();
double *dvector();
double **dmatrix();
int *ivector();
int **imatrix();
unsigned char *cvector();
unsigned long *lvector();
void free_vector();
void free_dvector();
void free_ivector();
void free_cvector();
void free_lvector();
void free_matrix();
void free_submatrix();
void free_convert_matrix();
void free_dmatrix();
void free_imatrix();
void free_f3tensor();

#endif /* ANSI */

#endif /* _NR_UTILS_H_ */
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru