数值计算-

18957 计算自然对数ln(x)的导数

求自然对数ln(x)的导数,输入双精度实数x>=1,输出自然对数ln(x)的导数(精确到小数点后2位有效数,小数点后第2位四舍五入所得)。

输入格式

m(整数,实验数据总数)
x1(实数,自然对数ln(x)的自变量)
X2实数,自然对数ln(x)的自变量)
...
xm(实数,自然对数ln(x)的自变量)

输出格式

y1(实数,自然对数ln(x1)的导数)
y2实数,自然对数ln(x2)的导数)
...
ym(实数,自然对数ln(xm)的导数)

输入样例

3
1.0
2.0
3.0

输出样例

1.00
0.50
0.33

#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
double ln(int x){
    double h=0.32;
    for(int i=0;i<20;i++){
        h/=2.0;
    }
    return log((x+h)/x)/h;

}
int main()
{
    int m;
    scanf("%d",&m);
    double x[100];
    for(int i=0;i<m;i++){
        scanf("%lf",&x[i]);
    }
    for(int i=0;i<m;i++){
        printf("%.2f\n",ln(x[i]));
    }
    return 0;
}

18991 实验1.2 调和级数求和

求调和级数前k项之和(1+1/2+1/3+...+1/k),输入整数k>0,输出两种调和级数前k项和,
前一种是从左到右求和;后一种是从右到左求和(使用双精度double类型精确到小数点后14位)。

输入格式

实验输入数据格式
m(整数,实验数据总数)
k1(整数,调和级数项数)
k2(整数,调和级数项数)
...
km(整数,调和级数项数)

输出格式

实验输出数据格式
x1(实数,k1项调和级数从左到右求和)  y1(实数,k1项调和级数从右到左求和) 
x2(实数,k2项调和级数从左到右求和)  y2(实数,k2项调和级数从右到左求和)
...
xm(实数,km项调和级数从左到右求和)  ym(实数,km项调和级数从右到左求和)

输入样例

3
10
100
1000

输出样例

2.92896825396825 2.92896825396825
5.18737751763962 5.18737751763962
7.48547086055034 7.48547086055034
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
double sumHSDL(int h){
    double sum=0;
    for(int i=1;i<=h;i++){
        sum+=1.0/i;
    }
    return sum;
}
double sumHSDR(int h){
    double sum=0;
    for(int i=h;i>=1;i--){
        sum+=1.0/i;
    }
    return sum;
}

int main()
{
   int m;
   cin>>m;
   vector<int> k;
    int a;
   for(int i=0;i<m;i++){
    cin>>a;
    k.push_back(a);
   }
   for(int i=0;i<m;i++){
        printf("%.14f ",sumHSDL(k[i]));
        printf("%.14f\n",sumHSDR(k[i]));
   }
   return 0;

}

18996 求正弦函数值

求正弦函数值,输入实数x(弧度,0到π) ,输出x对应的正弦函数值(使用双精度double类型精确到小数点后14位有效数)。

输入格式

m(整数,实验数据总数)
x1(弧度,0到π)
x2(弧度,0到π)
...
xm(弧度,0到π)

输出格式

实验输出数据格式
y1(实数,x1的正弦函数值)  
y2(实数,x2的正弦函数值)
...
ym(实数,xm的正弦函数值)

输入样例

3
0.0
0.5
1.0

输出样例

0.00000000000000
0.47942553860420
0.84147098480790
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
#define PI 3.1415926535897932l
int GetSinItemNumber(double x)
{ int N;
  if(x<0)x=-x;
       if(x<=PI/8)    N=6;
  else if(x<=PI/4)    N=8;
  else if(x<=PI/2)    N=10;
  else if(x<=3*PI/4)  N=12;
  else                N=14;
  return N;
}
double SINTV(double x)
{ int K,N;
  double y=1.0,xx=0.0,temp;
  N=GetSinItemNumber(x);
  K=N*2;
  xx=x*x;
  while(K>0)
  { y=1.0-y*xx/K/(K+1);
    K-=2;
  }
  return y*x;
}

int main()
{
    int m;
    scanf("%d",&m);
    double x[100];
    for(int i=0;i<m;i++){
        scanf("%lf",&x[i]);
    }
    for(int i=0;i<m;i++){
        printf("%.14lf\n",SINTV(x[i]));
    }
    return 0;
}

18997 求余弦函数值

求余弦函数值,输入实数x(弧度,0到π) ,输出x对应的余弦函数值(使用双精度double类型精确到小数点后14位有效数)。

输入格式

实验输入数据格式
m(整数,实验数据总数)
x1(弧度,0到π)
x2(弧度,0到π)
...
xm(弧度,0到π)

输出格式

实验输出数据格式
y1(实数,x1的余弦函数值)  
y2(实数,x2的余弦函数值)
...
ym(实数,x2的余弦函数值)

输入样例

3
0.0
0.5
1.0

输出样例

1.00000000000000
0.87758256189037
0.54030230586814
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
#define PI 3.1415926535897932l
int GetSinItemNumber(double x)
{ int N;
  if(x<0)x=-x;
       if(x<=PI/8)    N=6;
  else if(x<=PI/4)    N=8;
  else if(x<=PI/2)    N=10;
  else if(x<=3*PI/4)  N=12;
  else                N=14;
  return N;
}
double COSTV(double x)
{ int K,N;
  double y=1.0,xx;
  N=GetSinItemNumber(x)+1;
  K=N*2;
  xx=x*x;
  while(K>0)
  { y=1.0-y*xx/K/(K-1);
    K-=2;
  }
  return y;
}


int main()
{
    int m;
    scanf("%d",&m);
    double x[100];
    for(int i=0;i<m;i++){
        scanf("%lf",&x[i]);
    }
    for(int i=0;i<m;i++){
        printf("%.14lf\n",COSTV(x[i]));
    }
    return 0;
}

18998 求对数函数值ln(x)

求对数函数值,输入实数x>0 ,输出x对应的对数函数值ln(x)(使用双精度double类型精确到小数点后14位有效数)。
格式
实验输入数据格式
m(整数,实验数据总数)
x1(实数>0)
x2(实数>0)
...
xm(实数>0)

输出格式
实验输出数据格式
y1(实数,x1的对数函数值)  
y2(实数,x2的对数函数值)
...
ym(实数,xm的对数函数值)

输入样例

3
1.5
3.5
8.5

输出样例

0.40546510810816
1.25276296849537
2.14006616349627
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define MATHLOG 1
#define LOGTWO   0.69314718055994531
#define LOGTEN   2.3025850929940457
#ifndef ZERO
  #define ZERO 0.5E-100
#endif
using namespace std;
int GetLogItemNumber(double a)
{ int N;
       if(a<=1)   N=-1;
  else if(a<=1.2) N=7;
  else if(a<=1.5) N=10;
  else if(a<=2.0) N=15;
  else if(a<=3.0) N=24;
  else if(a<=10)  N=84;
  else  N=84*(int)(a/10);
  return N;
}
double LOGTV(double a)
{ int N=0,K,NK;
  double x,xx,y;
  x=(a-1)/(a+1);
  xx=x*x;
  N=GetLogItemNumber(a);
  NK=N*2+1;
  y=1.0/NK;
  for(K=N;K>0;K--)
  { NK-=2;
    y =1.0/NK+xx*y;
  }
  return 2.0*x*y;
}
double LOG(double a)
{ int TYPE=0,K=0;
  double x0,x,y,power=2.0;
  x=a;
   if(x<ZERO) return -100;
   if(x<1){x=1.0/x,TYPE=1;}
   while(power<x){ power*=2.0;K++;}
   y=LOGTV(2.0*x/power)+K*LOGTWO;
   if(TYPE==1)y=-y;
   return y;
}

int main()
{
    int m;
    scanf("%d",&m);
    double x[100];
    for(int i=0;i<m;i++){
        scanf("%lf",&x[i]);
    }
    for(int i=0;i<m;i++){
        printf("%.14lf\n",LOG(x[i]));
    }
    return 0;
}

18999 求指数函数值

求指数函数值,输入实数x ,输出x对应的指数函数值exp(x)
(使用双精度double类型精确到小数点后14位有效数)。

输入格式

实验输入数据格式
m(整数,实验数据总数)
x1(实数)
x2(实数)
...
xm(实数)

输出格式

实验输出数据格式
y1(实数,x1的指数函数值)  
y2(实数,x2的指数函数值)
...
ym(实数,xm的指数函数值)

输入样例

3
-1.0
0
1.5

输出样例

0.36787944117144
1.00000000000000
4.48168907033806
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define MATHEXP 1

#define EPOW01  2.7182818284590452
#define EPOW02  7.3890560989306502
#define EPOW10  22026.465794806717

double EXPTV(double x)
{ int N=23;
  int K=0;
  double y=1.0;
  if(x<=0.5) N=14; /*See Ch3 Table 7.1*/
  else if(x<=1.0) N=18;
  else            N=23;
  for(K=N;K>0;K--)
    y=1.0+y*x/K;
  return y;
}

double EXP(double x)
{ int TYPE=0;
  double y0=1.0;
  if(x<0){TYPE=1;x=-x;}
  while(1)
  {      if(x>10) {x-=10;y0*=EPOW10;}
    else if(x>2)  {x-=2; y0*=EXPTV(2);}
    else          break;
  }
  y0 *=EXPTV(x);
  if(TYPE==1) return 1.0/y0;
  else        return y0;
}

int main()
{
    int m;
    scanf("%d",&m);
    double x[100];
    for(int i=0;i<m;i++){
        scanf("%lf",&x[i]);
    }
    for(int i=0;i<m;i++){
        printf("%.14lf\n",EXP(x[i]));
    }
    return 0;
}

19000 二分法解非线性方程

二分法解非线性方程:给定非线性方程(x*x*x-2.0*x-2=0),输入区间起点实数A和终点实数B ,
输出满足最大误差(EPS=0.4E-14)时,最后的区间起点,区间终点,非线性方程根的近似值
(使用双精度double类型精确到小数点后15位有效数)。

输入格式

m(整数,实验数据总数)
A1 B1(实数,区间起点与终点)
A2 B2(实数,区间起点与终点)
...
Am Bm(实数,区间起点与终点)

输出格式

A B X(输出满足最大误差(EPS=0.4E-14)时,最后的区间起点,区间终点,非线性方程根的近似值)
  
A B X(输出满足最大误差(EPS=0.4E-14)时,最后的区间起点,区间终点,非线性方程根的近似值)
...
A B X(输出满足最大误差(EPS=0.4E-14)时,最后的区间起点,区间终点,非线性方程根的近似值)

输入样例

3
1.0 2.0
0.0 2.5
1.5 3.0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define  MN 51
int      RN=1;
double   ANS,ERR,EPS=0.4E-14;
double   A[MN],B[MN],X[MN],Y[MN],E[MN];
double f(double x){return x*x*x-2.0*x-2;}
// double   A0=0.0,B0=2.5;
double   A0,B0;

 int BISECTION(double A0,double B0)
{ double FA;
  int K;
  FA=f(A0);
  A[0]=A0;
  B[0]=B0;
  X[0]=(A0+B0)/2.0;
  Y[0]=f(X[0]);
  E[0]=(B0-A0)/2;
  for(K=1;K<MN;K++)
  { if(Y[K-1]*FA>0) {A[K]=X[K-1];B[K]=B[K-1];}
     else           {A[K]=A[K-1];B[K]=X[K-1];}
     X[K]=(A[K]+B[K])/2.0;
     Y[K]=f(X[K]);
     E[K]=(B[K]-A[K])/2;
     if(E[K]<EPS) break;
  }
  int k;
  if(K<MN)K++;
  RN=K;
  ANS=X[RN-1];
  ERR=E[RN-1];
  for(k=0;k<RN;k++)
  {  
      if(k==RN-1)
      printf("%.15f %.15f %.15f\n",A[k],B[k],X[k]);

 }
  return 0;
}
int main()
{ 
     int m = 1;
    scanf("%d", &m);
    double x[m], y[m];
    for (int i = 0; i < m; i++) {
   
        scanf("%lf %lf", &x[i],&y[i]);
    }
    for (int i = 0; i < m; i++) {
   
         BISECTION(x[i],y[i]);
    }

}

19001 黄金分割求函数最小值

黄金分割求函数最小值(GOLDEN=0.6180339887498948l):
给定非线性方程(exp(x)-2*x*x),输入区间起点实数A和终点实数B ,输出满足最大误差(EPS=0.4E-8)时,
最后的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值
(使用双精度double类型精确到小数点后9位有效数)。

输入格式
m(整数,实验数据总数)
A1 B1(实数,区间起点与终点)
A2 B2(实数,区间起点与终点)
...
Am Bm(实数,区间起点与终点)

输出格式

A X1 X2 B Y1 Y2(输出满足最大误差(EPS=0.4E-8)时,
的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值)
  
A X1 X2 B Y1 Y2(输出满足最大误差(EPS=0.4E-8)时,
最后的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值)
...
A X1 X2 B Y1 Y2(输出满足最大误差(EPS=0.4E-8)时,
最后的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值)

输入样例

3
1.5 3.5 
1.4 3.7 
1.3 3.9

输出样例

2.153292379 2.153292382 2.153292385 2.153292388 -0.660166554 -0.660166554
2.153292366 2.153292370 2.153292372 2.153292376 -0.660166554 -0.660166554
2.153292391 2.153292394 2.153292395 2.153292398 -0.660166554 -0.660166554
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define  MN   51
int      RN=1;
double  OPTX,OPTY,ERR;
double  GOLDEN=0.6180339887498948l;
double  A[MN],B[MN],AX[MN],BX[MN];
double  X1[MN],X2[MN],Y1[MN],Y2[MN];

/*  Exam 3.1 */
double  EPS=0.4E-8;
double f(double x){return exp(x)-2*x*x;}
int GoldenSection(double A0,double B0)
{ 
    int K;
  A[0]=A0;
  B[0]=B0;
  BX[0]=(B[0]-A[0])*GOLDEN;
  AX[0]=BX[0]*GOLDEN;
  X2[0]=A[0]+BX[0];
  Y2[0]=f(X2[0]);
  X1[0]=A[0]+AX[0];
  Y1[0]=f(X1[0]);
  for(K=1;K<MN;K++)
  { BX[K]=AX[K-1];
    AX[K]=BX[K]*GOLDEN;
    if(Y1[K-1]<Y2[K-1])
      { A[K]=A[K-1];B[K]=X2[K-1];
	X2[K]=X1[K-1];
	Y2[K]=Y1[K-1];
	X1[K]=A[K]+AX[K];
	Y1[K]=f(X1[K]);
      }
    else
      { A[K]=X1[K-1];B[K]=B[K-1];
	X1[K]=X2[K-1];
	Y1[K]=Y2[K-1];
	X2[K]=A[K]+BX[K];
	Y2[K]=f(X2[K]);
      }
   if(AX[K]<EPS) break;
  }
  if(K<MN)K++;
  RN=K;
  ERR=AX[RN-1];
  if(Y1[RN-1]<Y2[RN-1])
	 { OPTX=X1[RN-1];OPTY=Y1[RN-1];}
  else   { OPTX=X2[RN-1];OPTY=Y2[RN-1];}
    for(K=0;K<RN;K++)
  {  
      if(K==RN-1)
      printf("%.9f %.9f %.9f %.9f %.9f %.9f\n",A[K],X1[K],X2[K],B[K],Y1[K],Y2[K]);
    //   printf("%.9f %.9f %.9f\n",Y1[K],Y2[K],AX[K]);
 }
//   printf("%.9f %.9f %.9f\n\n",OPTX,OPTY,ERR);
  return 0;
}

int main()
{ 
     int m = 1;
    scanf("%d", &m);
    double x[m], y[m];
    for (int i = 0; i < m; i++) {
   
        scanf("%lf %lf", &x[i],&y[i]);
    }
    for (int i = 0; i < m; i++) {
   
         GoldenSection(x[i],y[i]);
    }

}

19020 选列主元约当消元法求线性方程组唯一解

选列主元约当消元法求线性方程组唯一解:
输入4*5的线性方程组的满秩增广矩阵,
输出方程组的解(使用双精度double类型精确到小数点后9位有效数)。

输入格式

m(整数,实验数据总数)
a11 a12 a13 a14 a15(实数,第1个增广矩阵的第1行5个数据)
a21 a22 a23 a24 a25(实数,第1个增广矩阵的第2行5个数据)
a31 a32 a33 a34 a35(实数,第1个增广矩阵的第3行5个数据)
a41 a42 a43 a44 a45(实数,第1个增广矩阵的第4行5个数据)
...

输出格式

 x1 x2 x3 x4(输出第1个方程组的解,精确到小数点后9位有效数)
 x1 x2 x3 x4(输出第2个方程组的解,精确到小数点后9位有效数)
...
 x1 x2 x3 x4(输出第m个方程组的解,精确到小数点后9位有效数)

输入样例

2
5.96912 -2.83547 -9.63744 8.13715 -0.46236
-9.31394 -7.37968 -3.62896 -0.62227 8.82260
-8.62545 2.22327 -9.32371 2.77932 2.70363
-1.63610 2.69204 -7.04398 -9.11191 5.51378
-9.97497 1.27171 -6.13392 6.17481 1.70019
-0.40254 -2.99417 7.91925 6.45680 4.93210
-6.51784 7.17887 4.21003 0.27070 -3.92010
-9.70031 -8.17194 -2.71096 -7.05374 -6.68203

输出样例

-0.270161097 -0.646876229 -0.339053371 -0.485617280
0.333728832 -0.224830010 -0.081245121 0.780055190

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
double b[4][5];
 
void getm(int k)//选取最大主列
{
    double temp;
    for(int i=k+1; i<4; i++)
    {
        if(fabs(b[k][k])<fabs(b[i][k]))
        {
            for(int a=k; a<5; a++)
            {
                temp = b[k][a];
                b[k][a] = b[i][a];
                b[i][a] = temp;
            }
        }
    }
  return ;
}
 
 
void Uppertriangle()//化上三角就是把对角线下面变成0
{
    double x;
    for(int i=0; i<3; i++)
    {
        getm(i);
        x = b[i][i];
        for(int a=i; a<5; a++)
        {
 
            b[i][a] = b[i][a]/x;//化1
        }
        for(int j=i+1; j<4; j++)
        {
            x = b[j][i];
            for(int a=i; a<5; a++)
            {
                b[j][a] = b[j][a]-b[i][a]*x;//化0
            }
 
        }
    }
}
 
void Lowertriangle()//化下三角就是把对角线上面变成0
{
    double x;
    for(int i=3; i>0; i--)
    {
        x = b[i][i];
        for(int a=i; a<5; a++)
        {
            b[i][a] = b[i][a]/x;//把对角线上值系数变成1
        }
        for(int j=i-1; j>=0; j--)
        {
            x = b[j][i];
            for(int a=j; a<5; a++)
            {
                b[j][a] = b[j][a]-b[i][a]*x;//在上三角基础上把第i列的第i项之外其他变成0
            }
        }
    }
}
 
 
int main()
{
    int n;
    scanf("%d",&n);
    while(n>0)
    {
        for(int i=0; i<4; i++)
        {
            for(int j=0; j<5; j++)
            {
                scanf("%lf",&b[i][j]);
            }
        }
        Uppertriangle();
        Lowertriangle();
printf("%0.9lf %0.9lf %0.9lf %0.9lf \n",
       b[0][4],b[1][4],b[2][4],b[3][4]);
        n--;
    }
    return 0;
}

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值