⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d14r2.cpp

📁 这个是常用的数值算法用VC编写的。相信对大家有用哦。
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#include <stdlib.h>
#include <fstream.h>
#include <string>
#include <process.h>

int sgn(double x)
{
	int temp;
	if(x>0)temp=1;
	if(x=0)temp=0;
	if(x<0)temp=-1;
	return temp;
}

int cint(double x)
{
	int temp;
	double iprt;
	if (x>0)
	{
	x=modf(x,&iprt);
		if(fabs(x)<0.5)
			temp=int(iprt);
		else
			temp=int(iprt+1);
	}
	else if(x==0)
		temp=0;
	else
	{
		x=modf(x,&iprt);
		if(fabs(x)<0.5)
			temp=int(iprt);
		else
			temp=int(iprt)-1;
	}
		return temp;
}

double bessj1(double x)
{
	double p1,p2,p3,p4,p5,q1,q2,q3,q4,q5;
	double r1,r2,r3,r4,r5,r6,s1,s2,s3,s4,s5,s6;
	double bbb,ccc,aaa,temp,ax,xx,z,y;
    r1 = 72362614232.0;           r2 = -7895059235.0;
    r3 = 242396853.1;            r4 = -2972611.439;
    r5 = 15704.4826;             r6 = -30.16036606;
    s1 = 144725228442.0;          s2 = 2300535178.0;
    s3 = 18583304.74;            s4 = 99447.43394;
    s5 = 376.9991397;            s6 = 1.0;
    p1 = 1.0;                     p2 = 0.00183105;
    p3 = -0.00003516396496;      p4 = 0.000002457520174;
    p5 = -0.000000240337019;
    q1 = 0.04687499995;          q2 = -0.0002002690873;
    q3 = 0.000008449199096;      q4 = -0.00000088228987;
    q5 = 0.000000105787412;
    if (fabs(x) < 8.0 )
	{
        y = x*x;
        aaa = r1 + y * (r2 + y * (r3 + y * (r4 + y * (r5 + y * r6))));
        bbb = s1 + y * (s2 + y * (s3 + y * (s4 + y * (s5 + y * s6))));
        temp = x * aaa / bbb;
	}
    else
	{
        ax = fabs(x);
        z = 8.0 / ax;
        y = z*z;;
        xx = ax - 2.356194491;
        aaa = p1 + y * (p2 + y * (p3 + y * (p4 + y * p5)));
        bbb = q1 + y * (q2 + y * (q3 + y * (q4 + y * q5)));
        ccc = sqrt(0.636619772 / ax);
        temp = ccc * (cos(xx) * aaa - z * sin(xx) * bbb * sgn(x));
	}  
	return temp;
}

double bessj0(double x)
{
	double p1,p2,p3,p4,p5,q1,q2,q3,q4,q5;
	double r1,r2,r3,r4,r5,r6,s1,s2,s3,s4,s5,s6;
	double y,bbb,ccc,aaa,temp,eee,ddd,ax,xx,z;
    p1 = 1.0;                  p2 = -0.001098628627;
    p3 = 0.00002734510407;    p4 = -0.000002073370639;
    p5 = 2.093887211e-07;
    q1 = -0.01562499995;      q2 = 0.0001430488765;
    q3 = -0.000006911147651;  q4 = 7.621095161e-07;
    q5 = -9.34945152e-08;
    r1 = 57568490574.0;        r2 = -13362590354.0;
    r3 = 651619640.7;         r4 = -11214424.18;
    r5 = 77392.33017;         r6 = -184.9052456;
    s1 = 57568490411.0;        s2 = 1029532985.0;
    s3 = 9494680.718;         s4 = 59272.64853;
    s5 = 267.8532712;        s6 = 1.0;
    if (fabs(x) < 8.0)
	{
       y = x * x;
       bbb = y * (r4 + y * (r5 + y * r6));
       aaa = r1 + y * (r2 + y * (r3 + bbb));
       ccc = y * (s3 + y * (s4 + y * (s5 + y * s6)));
       temp = aaa / (s1 + y * (s2 + ccc));
	}
    else
	{
       ax = fabs(x);
       z = 8.0 / ax;
       y = z * z;
       xx = ax - 0.785398164;
       ccc = y * (p3 + y * (p4 + y * p5));
       aaa = p1 + y * (p2 + ccc);
       ddd = y * (q3 + y * (q4 + y * q5));
       eee = z * sin(xx) * (q1 + y * (q2 + ddd));
       temp = sqrt(0.636619772 / ax) * (cos(xx) * aaa - eee);
	}
	return temp;
}

double bessj(int n, double x)
{
	int iacc,j,m;
	double temp,bigno,bigni,ax,tox,bj,bjp,bjm,besj,jsum,sum;
    iacc = 40;
    bigno = 10000000000.0;
    bigni = 0.0000000001;
    if (n < 2 )
	{
        cout<<"bad argument n in bassj";
        _c_exit();
    }
    ax = fabs(x);
    if( ax == 0) 
	{
        temp = 0.0;
	}
    else if (ax > float(n))
	{
        tox = 2.0 / ax;
        bjm = bessj0(ax);
        bj = bessj1(ax);
        for( j = 1;j<=n-1;j++)
		{
            bjp = j * tox * bj - bjm;
            bjm = bj;
            bj = bjp;
        }
        temp = bj;
	}
    else
	{
        tox = 2.0 / ax;
        m = 2 * int(((n + int(sqrt(iacc * n)))) / 2);
        besj = 0.0;
        jsum = 0;
        sum = 0.0;
        bjp = 0.0;
        bj = 1.0;
        for (j = m;j>=1;j--)
		{
            bjm = j * tox * bj - bjp;
            bjp = bj;
            bj = bjm;
            if (fabs(bj) > bigno)
			{
                bj = bj * bigni;
                bjp = bjp * bigni;
                besj = besj * bigni;
                sum = sum * bigni;
            }
            if (jsum != 0) sum = sum + bj;
            jsum = 1 - jsum;
            if (j == n) besj = bjp;
        }
        sum = 2.0 * sum - bj;
        temp = besj / sum;		
    }
	return temp;
}

void derivs(double x, double y[],double dydx[])
{
    dydx[1] = -y[2];
    dydx[2] = y[1] - (1.0 / x) * y[2];
    dydx[3] = y[2] - (2.0 / x) * y[3];
    dydx[4] = y[3] - (3.0 / x) * y[4];
}

void rk4(double y[], double dydx[], int n, double &x, double &h, double yout[])
{
	int i;
    double yt[11], dyt[11], dym[11],hh,h6,xh;
    hh = h * 0.5;
    h6 = h / 6.0;
    xh = x + hh;
    for( i = 1;i<=n;i++)
	{
        yt[i] = y[i] + hh * dydx[i];
    }
    derivs(xh, yt, dyt);
    for( i = 1;i<=n;i++)
	{
        yt[i] = y[i] + hh * dyt[i];
    }
    derivs(xh, yt, dym);
    for( i = 1;i<=n;i++)
	{
        yt[i] = y[i] + h * dym[i];
        dym[i] = dyt[i] + dym[i];
    }
    derivs(x + h, yt, dyt);
    for (i = 1;i<=n;i++)
	{
        yout[i] = y[i] + h6 * (dydx[i] + dyt[i] + 2.0 * dym[i]);
    }
	for(i=1;i<=10;i++)
	{
		dym[i]=0.0;
		dyt[i]=0.0;
		yt[i]=0.0;
	}
}

void rkdumb(double vstart[5], double nvar, double x1, double x2, double nstep, double xx[201], double y[11][201])
{
	int i,k;
    double v[11], dv[11],x,h;
    for( i = 1; i<=nvar; i++)
	{
        v[i] = vstart[i];
        y[i][ 1] = v[i];
    }
    xx[1] = x1;
    x = x1;
    h = (x2 - x1) / float(nstep);
    for( k = 1; k<=nstep; k++)
	{
        derivs(x, v, dv);
        rk4(v, dv, nvar, x, h, v);
        if( x + h == x)
		{
            cout<<" stepsize not signficant in rkdumb."<<endl;
            _c_exit();
        }
        x = x + h;
        xx[k + 1] = x;
        for( i = 1; i<=nvar; i++)
		{
            y[i][k + 1] = v[i];
        }
    }
    for(i=1; i<=10; i++)
	{
		v[i]=0.0;
		dv[i]=0.0;
	}
}

void main()
{
    //program d14r2
    //driver for routine rkdumb
	int i,j;
	double vstart[5], xx[201], y[11][201],nvar,nstep,x1,x2;
    nvar = 4;
    nstep = 150;
    x1 = 1.0;
    vstart[1] = bessj0(x1);
    vstart[2] = bessj1(x1);
    vstart[3] = bessj(2,x1);
    vstart[4] = bessj(3,x1);
    x2 = 20.0;
    rkdumb(vstart, nvar, x1, x2, nstep, xx, y);
    cout<<endl;
    cout<<"    x          Integrated        Bessj3"<<endl;
    for( i = 1; i<=cint(nstep / 10); i++)
	{
        j = 10 * i;
        cout<<setw(8)<<xx[j];
        cout<<setw(16)<<y[4][j];
        cout<<setw(16)<<bessj(3, xx[j])<<endl;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -