Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 00:18   #1
DrakonST
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 2
По умолчанию Интерполяция кубическим сплайном

Ошибка в процессе работы программы: Необработанное исключение типа "System.NullReferenceException" произошло в Splain.exe
Дополнительные сведения: В экземпляре объекта не задана ссылка на объект.

Код:
TSplain.h

#pragma once
#include <math.h>
using namespace System;
//---------------------------------------------------------
struct DiagMatrixSimpl
{ 
	int n;
	double kappa1,kappa2,mu1,mu2,*phi,*y;
};
//---------------------------------------------------------
class DiagsMatrixSimpl:public DiagMatrixSimpl
{
	double *alpha,*betta;
	bool flag;//использовалось ли SetN
public:
	DiagMatrixSimpl Matr;
	DiagsMatrixSimpl()
	{
		flag=false;
	}
	virtual ~DiagsMatrixSimpl()
	{
		delete [] alpha;
		delete [] betta;
	}
	void CalculationAlphaBetta();
	void ProgonkaPryamo();
	void ProgonkaObratno();
	double* GetAlpha();
	double* GetBetta();
	void SetN(int n);
	void SetMatr(double kappa11,double kappa21,double mu11,double mu21);
	void SetMatrPhi(double Phi1,int i);
	double* GetMatrY();
	void CalculationMatrix();
};
//---------------------------------------------------------
class TSplain:public DiagMatrixSimpl
{
	DiagsMatrixSimpl Mattr;
	int nn;//количество шагов в сетке
	double *a,*b,*c,*d;//коээициенты сплайна
	double *x,*f;//сетка
	double *g0,*g1,*g2,*g3;//кооэициенты кратной формы сплайна
//	double h;
	bool ff;
public:
	double h;
	TSplain()
	{
		f=false;
	}
	virtual ~TSplain()
	{
	}
	void SetNN(int v);
	void SetMattr();
	double CalculationSplain(double xi,int i);
	void CalculationABCD();
	void SetSetka(double xi,double fi,int i);
	void KratFormSplain();
	void SetC0_Cn(double c0,double cn);
	double GetXi(int i);
};
DrakonST вне форума Ответить с цитированием
Старый 02.11.2011, 00:21   #2
DrakonST
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 2
По умолчанию

Код:
TSplain.cpp

#include "StdAfx.h"
#include "TSplain.h"
#include <math.h>
void DiagsMatrixSimpl::SetN(int n)
{
	Matr.n=n;
	alpha=new double[n];
	betta=new double[n];
	if (flag)
	{		
		delete [] phi;
		delete [] y;
	}	
	Matr.phi=new double[n];
	Matr.y=new double[n];
	flag=true;
}
//------------------------------------------------
void DiagsMatrixSimpl::CalculationAlphaBetta()
{
	alpha[1]=-kappa1;
	betta[1]=mu1;
	for(int i=1;i<Matr.n;i++)
	{
		alpha[i+1]=1./(-4.-alpha[i]);
		betta[i+1]=((phi[i])*(-1.)-betta[i])/(-4.-alpha[i]);
	}
}
//------------------------------------------------
void DiagsMatrixSimpl::ProgonkaPryamo()
{
	CalculationAlphaBetta();
}
//------------------------------------------------
void DiagsMatrixSimpl::ProgonkaObratno()
{
	Matr.y[n]=(mu2+kappa2*betta[n])/(1+kappa2*alpha[n]);
	for(int i=n-1;i>0;i--)
	{
		Matr.y[i]=alpha[i+1]*Matr.y[i+1]+betta[i+1];
	}
}
//------------------------------------------------
double* DiagsMatrixSimpl::GetAlpha()
{
	return alpha;
}
//------------------------------------------------
double* DiagsMatrixSimpl::GetBetta()
{
	return betta;
}
//------------------------------------------------
void DiagsMatrixSimpl::SetMatrPhi(double Phi1,int i)
{
	phi[i]=Phi1;
}
//------------------------------------------------
void DiagsMatrixSimpl::SetMatr(double kappa11, double kappa21, double mu11, double mu21)
{	
	kappa1=kappa11;
	kappa2=kappa21;
	mu1=mu11;
	mu2=mu21;
}
//------------------------------------------------
double* DiagsMatrixSimpl::GetMatrY()
{
	return y;
}
//------------------------------------------------
void DiagsMatrixSimpl::CalculationMatrix()
{
	ProgonkaPryamo();
	ProgonkaObratno();
}
//------------------------------------------------
void TSplain::SetNN(int v)
{
	nn=v;
	if (ff)
	{
		delete [] a;
		delete [] b;
		delete [] c;
		delete [] d;
		delete [] x;
		delete [] f;
		delete [] g0;
		delete [] g1;
		delete [] g2;
		delete [] g3;
	}
	a=new double[nn];
	b=new double[nn];
	c=new double[nn];
	d=new double[nn];
	x=new double[nn];
	g0=new double[nn];
	g1=new double[nn];
	g2=new double[nn];
	g3=new double[nn];
	f=new double[nn];
	ff=true;
	h=1.0/nn;
}
//------------------------------------------------
void TSplain::SetC0_Cn(double c0, double cn)
{
	c[0]=c0;
	c[nn-1]=cn;
}
//------------------------------------------------
void TSplain::CalculationABCD()
{
	SetMattr();
	Mattr.CalculationMatrix();
	for(int i=1;i<nn;i++)
	{
		if (i!=nn-1)
			c[i]=Mattr.y[i];
		a[i]=f[i];
		d[i]=(c[i]-c[i-1])/h;
		b[i]=1./3.*h*c[i]+1/6.*h*c[i-1]+(f[i]-f[i-1])/h;
	}
}
//------------------------------------------------
void TSplain::KratFormSplain()
{
	for(int i=1;i<nn;i++)
	{
		g0[i]=d[i]/6.;
		g1[i]=(c[i]-d[i]*x[i])/2.;
		g2[i]=b[i]-g1[i]*x[i];
		g3[i]=a[i]-b[i]*x[i]+c[i]*x[i]*x[i]/2.-d[i]*x[i]*x[i]*x[i]/6.;
	}
}
//------------------------------------------------
double TSplain::CalculationSplain(double xi,int i)
{
	double r=g0[i]*x[i]*x[i]*x[i]+g1[i]*x[i]*x[i]+g2[i]*x[i]+g3[i];
	return r;
}
//------------------------------------------------
void TSplain::SetSetka(double xi, double fi, int i)
{
	x[i]=xi;
	f[i]=fi;
}
//------------------------------------------------
void TSplain::SetMattr()
{
	Mattr.SetN(nn-1);
	double q1,q2;
	q1=3.*(f[2]-2*f[1]+f[0])/(2.*h*h);
	q2=3*(f[n-1]-2*f[n-2]+f[n-3])/(2.*h*h);
	Mattr.SetMatr(-0.25,-0.25,q1,q2);
	for(int i=1;i<Mattr.Matr.n-1;i++)
	{	
		q1=6.*(f[i+2]-2*f[i-1]+f[i])/(h*h);
		Mattr.Matr.phi[i]=q1;
//		Mattr.SetMatrPhi(q1,i);
	}
}
//------------------------------------------------
double TSplain::GetXi(int i)
{
	return x[i];
}
Ругается на строчку: betta[i+1]=((phi[i])*(-1.)-betta[i])/(-4.-alpha[i]);

Порядок вызова функций класса в проге:

Sp.SetNN(n);
Sp.SetC0_Cn(0,0);
Sp.SetSetka(-1,2,0);
for(int i=1;i<n;i++)
{
if (Sp.GetXi(i)<0)
Sp.SetSetka(Sp.GetXi(0)+(2/n)*i,Sp.GetXi(i)*Sp.GetXi(i)*Sp.Get Xi(i)+3*Sp.GetXi(i)*Sp.GetXi(i),i);
else
Sp.SetSetka(Sp.GetXi(0)+(2/n)*i,3*Sp.GetXi(i)*Sp.GetXi(i)-Sp.GetXi(i)*Sp.GetXi(i)*Sp.GetXi(i) ,i);
}
Sp.CalculationABCD();
DrakonST вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
интерполяция кубическим сплайном Elena123456 Помощь студентам 2 07.01.2011 13:27
интерполяция кубическим сплайном Elena123456 Visual C++ 17 04.01.2011 17:14
Интерполяция изображения Бикубическим сплайном Danyla Помощь студентам 5 31.05.2010 02:23
Интерполяция изображений(Сплайн интерполяция)?????) Danyla Помощь студентам 0 13.04.2010 09:08
интерполяция Laplas Общие вопросы C/C++ 6 06.03.2010 12:03