Код:
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();