📄 question.h
字号:
#include "function.h"
void newton4()
{
double c=-1;
int n=-1;
while(c<=0)
{
cout<<"请输入底数!"<<endl;
cin>>c;
}
while(n<0)
{
cout<<"请输入指数的倒数!"<<endl;
cin>>n;
}
if(n==0)
{
cout<<c<<"开"<<n<<"次方为:"<<1.0<<endl;
return ;
}
else
{
double x0=(c+n-1)*1.0/n,x1=x0;
do
{
x0=x1;
double x0bak=1.0;
for(int i=0;i<n-1;i++)
x0bak*=x0;
x1=x0-(x0bak*x0-c)/(n*x0bak);
}while(fabs(x1-x0)>dps);
cout<<c<<"开"<<n<<"次方为:"<<(x1+x0)/2<<endl;
}
}
void qingjiuzhao1()
{
int size=-1;
while(size<0)
{
cout<<"请输入多项式的最高次幂!"<<endl;
cin>>size;
}
double x,*ch=new double[size+1];
cout<<"请输入全部的系数(从低次幂到高次幂)!("<<size+1<<"个)"<<endl;
for(int i=0;i<=size;i++)
cin>>ch[i];
cout<<"请输入x的值!"<<endl;
cin>>x;
double s=ch[size];
for(i=size-1;i>=0;i--)
{
s*=x;
s+=ch[i];
}
cout<<"多项式:";
for(i=size;i>0;i--)
{
cout<<ch[i]<<"*"<<x<<"^"<<i<<"+";
}
cout<<ch[0]<<"="<<s<<endl;
delete []ch;
}
void getsolution6()
{
int n=-1;
while(n<=0)
{
cout<<"请输入变元的个数!"<<endl;
cin>>n;
}
double **ch;
make2darray(ch,n,n+1);
cout<<"请输入方程组的增广矩阵!("<<n<<"*"<<n+1<<")"<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<=n;j++)
cin>>ch[i][j];
show(ch,n,n,0);
for(i=0;i<n;i++)
{ //选取主元素
int maxflag=i;
for(int j=maxflag+1;j<n;j++)
if(fabs(ch[j][i])>fabs(ch[maxflag][i]))
maxflag=j;
if(fabs(ch[i][maxflag])<dps)
{
cout<<"有多余的方程存在!有很多解!"<<endl;
return;
}
if(maxflag!=i)
for(j=i;j<=n;j++)
swap(ch[maxflag][j],ch[i][j]);
//开始消元
for(j=i+1;j<n;j++)
{
double temp=ch[j][i]/ch[i][i];
for(int k=i;k<=n;k++)
ch[j][k]=ch[j][k]-ch[i][k]*temp;
}
}
show(ch,n,n,1);
//开始求解*/
ch[n-1][n]/=ch[n-1][n-1];
for(i=n-2;i>=0;i--)
{
for(int j=i+1;j<n;j++)
ch[i][n]-=ch[i][j]*ch[j][n];
ch[i][n]/=ch[i][i];
}
cout<<"方程的解为:"<<endl;
for(i=0;i<n;i++)
cout<<"Y"<<i+1<<"="<<ch[i][n]<<endl;
delete2darray(ch,n);
}
void jacobi5()
{
int n=-1,num=0,needchange=0;
double flag=0;
while(n<=0)
{
cout<<"请输入变元的个数!"<<endl;
cin>>n;
}
double **ch,*x=new double[n],maxgap=2,*xbak=new double[n];
make2darray(ch,n,n+1);
cout<<"请输入方程组的增广矩阵!("<<n<<"*"<<n+1<<")"<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<=n;j++)
cin>>ch[i][j];
show(ch,n,n,0);
for(i=0;i<n;i++)
if(fabs(ch[i][i])<dps)
{
needchange=1;
int success=0;
for(int j=0;j<n&&success==0;j++)
if(i!=j&&fabs(ch[i][j])>dps)
for(int k=0;k<n&&success==0;k++)
if(fabs(ch[k][i])>dps)
{
for(int p=0;p<=n;p++)
swap(ch[k][p],ch[i][p]);
success=1;
}
if(success==0)
{
cout<<"此方程应该没有唯一解或者方程有问题!"<<endl;
return;
}
}
if(needchange)
{
cout<<"输入方程组无法直接解,经过变换如下:"<<endl;
show(ch,n,n,0);
}
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(i!=j)
ch[i][j]/=-ch[i][i];
ch[i][n]/=ch[i][i];
}
showdiedai(ch,n,n);
for(i=0;i<n;i++)
xbak[i]=0;
while(maxgap>dps&&flag<maxsize&&num<maxsize)
{
for(i=0;i<n;i++)
{
x[i]=0;
for(int j=0;j<n;j++)
if(i!=j)
x[i]+=ch[i][j]*xbak[j];
x[i]+=ch[i][n];
}
maxgap=0;
for(i=0;i<n;i++)
if(maxgap<fabs(x[i]-xbak[i]))
maxgap=fabs(x[i]-xbak[i]);
for(i=0;i<n;i++)
xbak[i]=x[i];
if(flag<maxgap)
flag=maxgap;
num++;
}
if(flag>=maxsize||num>=maxsize)
cout<<"迭代过程不收敛!此方法失效!"<<endl;
else
{
cout<<"方程的解为:"<<endl;
for(i=0;i<n;i++)
cout<<"X"<<i+1<<"="<<xbak[i]<<endl;
}
delete2darray(ch,n);
delete []x;
delete []xbak;
}
void g_s5()
{
int n=-1,num=0,needchange=0;
double max=0;
while(n<=0)
{
cout<<"请输入变元的个数!"<<endl;
cin>>n;
}
double **ch,*x=new double[n],maxgap=2;
make2darray(ch,n,n+1);
cout<<"请输入方程组的增广矩阵!("<<n<<"*"<<n+1<<")"<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<=n;j++)
cin>>ch[i][j];
show(ch,n,n,0);
for(i=0;i<n;i++)
if(fabs(ch[i][i])<dps)
{
needchange=1;
int success=0;
for(int j=0;j<n&&success==0;j++)
if(i!=j&&fabs(ch[i][j])>dps)
for(int k=0;k<n&&success==0;k++)
if(fabs(ch[k][i])>dps)
{
for(int p=0;p<=n;p++)
swap(ch[k][p],ch[i][p]);
success=1;
}
if(success==0)
{
cout<<"此方程应该没有唯一解或者方程有问题!"<<endl;
return;
}
}
if(needchange)
{
cout<<"输入方程组无法直接解,经过变换如下:"<<endl;
show(ch,n,n,0);
}
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(i!=j)
ch[i][j]/=-ch[i][i];
ch[i][n]/=ch[i][i];
}
showdiedai(ch,n,n);
for(i=0;i<n;i++)
x[i]=0;
while(maxgap>dps&&max<maxsize&&num<maxsize)
{
maxgap=0;
for(i=0;i<n;i++)
{
double xbak=x[i];
x[i]=0;
for(int j=0;j<n;j++)
if(i!=j)
x[i]+=ch[i][j]*x[j];
x[i]+=ch[i][n];
if(maxgap<fabs(x[i]-xbak))
maxgap=fabs(x[i]-xbak);
}
if(max<maxgap)
max=maxgap;
num++;
}
if(max>=maxsize||num>=maxsize)
cout<<"迭代过程不收敛!此方法失效!"<<endl;
else
{
cout<<"方程的解为:"<<endl;
for(i=0;i<n;i++)
cout<<"X"<<i+1<<"="<<x[i]<<endl;
}
delete2darray(ch,n);
delete []x;
}
void jifen3(int select)
{
if(select>=1&&select<=2)
{
int n=-1;
while(n<=0)
{
cout<<"请输入区间等份数!"<<endl;
cin>>n;
}
double result=0,h=(1-0)*1.0/n;
if(select==1)
{
for(int k=0;k<n;k++)
result+=1.0/(1+k*k*h*h)+1.0/(1+h*h*(k+1)*(k+1));
result=result*h/2;
cout<<"等分"<<n<<"份的梯形公式求积结果为:"<<result<<" (0.78539816)"<<endl;
}
else
{
for(int k=0;k<n;k++)
result+=1.0/(1+k*k*h*h)+1.0/(1+h*h*(k+1)*(k+1))+4.0/(1+h*h*(k+0.5)*(k+0.5));
result=result*h/6;
cout<<"等分"<<n<<"份的simpson求积结果为:"<<result<<" (0.78539816)"<<endl;
}
}
else
if(select==3)
{
double h=1;
double t1=h*(1.0/1+1.0/(1+h*h))/2,t2=-1,gap=1;
int block=1,step=0;
while(gap>dps)
{
t2=t1/2;
double temp=0;
for(int k=0;k<block;k++)
temp+=1.0/(1+h*h*(k+0.5)*(k+0.5));
temp=temp*h/2;
t2+=temp;
block*=2;
h/=2;
gap=fabs(t1-t2);
t1=t2;
step++;
}
cout<<"用变步长的梯形公式求得结果为:"<<t2<<" (0.78539816)--step="<<step<<endl;
}
}
void newton2()
{
int n=-1;
while(n<=0)
{
cout<<"请输入已知点对的个数!"<<endl;
cin>>n;
}
double **ch,*x=new double[n],*y=new double[n],x0,result=0,addx,addy;
make2darray(ch,n,n);
cout<<"请输入"<<n<<"个点对的值!(先x后y)"<<endl;
for(int i=0;i<n;i++)
cin>>x[i]>>y[i];
for(i=0;i<n;i++)
ch[i][0]=y[i];
for(i=1;i<n;i++)//i为列
for(int j=i;j<n;j++)
ch[j][i]=(ch[j][i-1]-ch[j-1][i-1])/(x[j]-x[j-1]);
cout<<"各个差商计算如下:"<<endl;
for(i=0;i<n;i++)
cout<<"C"<<i<<"="<<ch[i][i]<<endl;
showju(ch,x,n);
cout<<"牛顿插值公式为:"<<endl;
cout<<"f(x)=";
for(i=0;i<n;i++)
{
if(fabs(ch[i][i])>dps)
{
if(fabs(ch[i][i]-1)>dps)
cout<<ch[i][i];
else
if(fabs(ch[i][i]+1)<dps)
cout<<"-";
for(int j=0;j<i;j++)
{
cout<<"(x";
if(x[j]>0)
cout<<"-";
else
cout<<"+";
cout<<fabs(x[j])<<")";
}
if(i<n-1&&fabs(ch[i+1][i+1])>dps&&ch[i+1][i+1]>0)
cout<<"+";
}
}
cout<<'\b'<<endl;
cout<<"请输入你要计算x点的值!"<<endl;
cin>>x0;
for(i=0;i<n;i++)
{
double temp=ch[i][i];
for(int j=0;j<i;j++)
temp*=x0-x[j];
result+=temp;
}
cout<<"有上述公式计算x="<<x0<<"的y="<<result<<endl;
cout<<"请输入新增加节点的坐标(x,y)"<<endl;
cin>>addx>>addy;
double *newx=new double[n+1],**newch;
make2darray(newch,n+1,n+1);
for(i=0;i<n;i++)
{
newx[i]=x[i];
for(int j=0;j<=i;j++)
newch[i][j]=ch[i][j];
}
newx[n]=addx;
newch[n][0]=addy;
delete []x;
delete []y;
delete2darray(ch,n);
for(i=1;i<=n;i++)
newch[n][i]=(newch[n][i-1]-newch[n-1][i-1])/(newx[n]-newx[n-1]);
showju(newch,newx,n+1);
cout<<"C"<<n+1<<"="<<newch[n][n]<<endl;
delete []newx;
delete2darray(newch,n+1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -