用C语言编写数值分析作业题
数值分析大作业

数值分析上机作业(一)一、算法的设计方案1、幂法求解λ1、λ501幂法主要用于计算矩阵的按模最大的特征值和相应的特征向量,即对于|λ1|≥|λ2|≥.....≥|λn|可以采用幂法直接求出λ1,但在本题中λ1≤λ2≤……≤λ501,我们无法判断按模最大的特征值。
但是由矩阵A的特征值条件可知|λ1|和|λ501|之间必然有一个是最大的,通过对矩阵A使用幂法迭代一定次数后得到满足精度ε=10−12的特征值λ0,然后在对矩阵A做如下的平移:B=A-λ0I由线性代数(A-PI)x=(λ-p)x可得矩阵B的特征值为:λ1-λ0、λ2-λ0…….λ501-λ0。
对B矩阵采用幂法求出B矩阵按模最大的特征值为λ∗=λ501-λ0,所以λ501=λ∗+λ0,比较λ0与λ501的大小,若λ0>λ501则λ1=λ501,λ501=λ0;若λ0<λ501,则令t=λ501,λ1=λ0,λ501=t。
求矩阵M按模最大的特征值λ的具体算法如下:任取非零向量u0∈R nηk−1=u T(k−1)∗u k−1y k−1=u k−1ηk−1u k=Ay k−1βk=y Tk−1u k(k=1,2,3……)当|βk−βk−1||βk|≤ε=10−12时,迭终终止,并且令λ1=βk2、反幂法计算λs和λik由已知条件可知λs是矩阵A 按模最小的特征值,可以应用反幂法直接求解出λs。
使用带偏移量的反幂法求解λik,其中偏移量为μk=λ1+kλ501−λ140(k=1,2,3…39),构造矩阵C=A-μk I,矩阵C的特征值为λik−μk,对矩阵C使用反幂法求得按模最小特征值λ0,则有λik=1λ0+μk。
求解矩阵M按模最小特征值的具体算法如下:任取非零向量u 0∈R n ηk−1= u T (k−1)∗u k−1y k−1=u k−1ηk−1 Au k =y k−1βk =y T k−1u k (k=1,2,3……)在反幂法中每一次迭代都要求解线性方程组Au k =y k−1,当K 足够大时,取λn =1βk 。
数值分析幂法c语言实现

1.实验目的:1熟练掌握C 语言程序设计,编程求解问题。
2.运用幂法求解住特征值和特征向量。
2.实验内容:例题:用幂法求 A=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡0.225.05.025.00.10.15.00.10.1 的特征值和特征向量。
完整代码以及截图如下:#include "stdio.h"#include "math.h"#define M 3void main(){float fan(),max(),e1,e2,r1,r2;void au(),ex(),print_x(),std();static float a[M][M]={{1.0,1.0,0.5},{1.0,1.0,0.25},{0.5,0.25,2.0}}; static float u0[M],u1[M],maxn0,maxn1;int i;printf("*********************************\n");printf("****** 幂法*********\n");printf("******求特征值与特征向量*********\n");printf("*********************************\n\n");printf("input precision e1,e2:");scanf("%f,%f",&e1,&e2);printf("\ninput u(%d):",M);for (i=0;i<M;++i){scanf("%f",&u0[i]);}std(u0);maxn0=max(u0);i=0;printf("\n- - - - - - - - - - - - - - - - - -\n");printf(" ............NMD\n");do{au(a,u0,u1);maxn1=max(u1);std(u1);r1=fan(u0,u1);r2=(float)fabs(maxn0-maxn1);maxn0=maxn1;if (r1>e1 || r2>e2){printf("%4d",i++);print_x(u0);printf("\n");ex(u0,u1);}elsebreak;} while (1);}void au(a,u0,u1)float a[][M],u0[],u1[];{int i,j;for (i=0;i<M;i++){u1[i]=0;for (j=0;j<M;j++){u1[i]+=a[i][j]*u0[j];}}}void std(u)float u[];{int i;float t,max();t=max(u);for (i=0;i<M;i++){u[i]=u[i]/t;}}float fan(u0,u1)float u0[],u1[];{float max();int i;float uu[M];for (i=0;i<M;i++){uu[i]=u0[i]-u1[i];}return max(uu);}float max(u)float u[];{int i;float m;m=u[0];for (i=0;i<M;i++){if (u[i]>m){m=u[i];}}return m;}void ex(u0,u1)float u0[],u1[];{int i;for (i=0;i<M;i++){u0[i]=u1[i];}}void print_x(u)float u[];{int i;for (i=0;i<M;i++){printf("%12.6f",u[i]);}}3.运行结果:。
c语言数学练习题

c语言数学练习题
1. 编写一个C语言程序,计算并输出1到100之间所有偶数的和。
2. 给定一个整数数组,编写一个函数,找出数组中的最大值和最小值,并返回它们的和。
3. 设计一个C语言程序,实现一个简单的计算器,能够进行加、减、乘、除四则运算。
4. 编写一个C语言函数,输入一个浮点数,输出该数的平方根。
5. 给定一个整数n,编写一个程序,输出n以内所有素数,并计算它
们的总和。
6. 编写一个C语言程序,实现一个函数,该函数接受一个字符串作为
参数,并返回该字符串中所有数字字符的和。
7. 设计一个C语言程序,计算并输出一个给定整数的阶乘。
8. 编写一个C语言程序,实现一个函数,该函数接受两个整数作为参数,并返回这两个整数的最大公约数。
9. 设计一个C语言程序,计算并输出一个给定日期是该年的第几天。
10. 编写一个C语言程序,实现一个函数,该函数接受一个整数数组
和数组的大小作为参数,然后输出数组中所有奇数的乘积。
数值计算问题_C语言程序设计(第2版)_[共2页]
![数值计算问题_C语言程序设计(第2版)_[共2页]](https://img.taocdn.com/s3/m/2e8fbe385ef7ba0d4a733bf6.png)
即判断 m/n 的余数是否为 0。
例如,若要判断 X 是否为偶数,只要判断 X 能否被 2 整除,判断语句中的表达式可以写为 X%2 == 0。
2.累加
形如:
1 + 2 + 3 +…+ 100,
1! + 3! + 5! +…+ n!,
1
1 2
1 3
…
ቤተ መጻሕፍቲ ባይዱ1 n
,
等都属于累加的问题。
累加问题一般通过在循环体中设置一个累加器来实现。例如,若累加和存于变量 s 中,x 为每次要
累加的数值,则累加器就写为 s = s + x。在循环之前 s 的初值为 0(即 s = 0),x 的值可随循环而改变。
如前面提到的计算
1
1 2
1 3
…
1 n
的问题,假设循环变量为
i,则程序中的累加器可写为
s = s + 1.0/i。
3.累乘
形如:
1 × 2 × 3 ×…× n,
1
1 2
1 3
…
1 n
,
67
方程、分解因式等。编程解决以上问题时,涉及的主要算法有:计算公式、整除、取整、求余数、
累加、累乘等。熟练掌握这些算法,将对编程带来极大的方便。
1.整除
判断一个数的奇偶性、判断素数、判断一个数能否被另一个数整除等都与整除有关。
设 m,n 是两个整型数值,要判断 m 是否能被 n 整除,只要判断算式 m%n 的结果是否为 0,
第 3 章 C 语言程序控制结构
图 3-29 例 3.27 程序运行结果
3.5 综合程序设计举例
前面已经学习了 C 语言程序控制结构及程序设计的各种方法,利用这些方法,我们可以解决 实际应用中出现的各种问题。
数值方法(第2版)答案

C语言编程习题第二章习题2-25.用二分法编程求6x4 -40x2+9=0 的所有实根。
#include <stdio.h>#include <math.h>#define N 10000double A,B,C;double f(double x){return (A*x*x*x*x+B*x*x+C);}void BM(double a,double b,double eps1,double eps2){int k;double x,xe;double valuea = f(a);double valueb = f(b);if (valuea > 0 && valueb > 0 || valuea <0 && valueb < 0) return;printf("Finding root in the range: [%.3lf, %.3lf]\n", a, b);for(k=1;k<=N;k++) {x=(a+b)/2;xe=(b-a)/2;if(fabs(xe)<eps2 || fabs(f(x))<eps1) {printf("The x value is:%g\n",x);printf("f(x)=%g\n\n",f(x));return;}if(f(a)*f(x)<0) b=x;else a=x;}printf("No convergence!\n");}int main(){double a,b,eps1,eps2,step,start;printf("Please input A,B,C:\n");scanf("%lf %lf %lf",&A,&B,&C);printf("Please input a,b, step, eps1,eps2:\n");scanf("%lf %lf %lf %lf %lf",&a,&b,&step,&eps1,&eps2);for (start=a; (start+step) <= b; start += step) { double left = start;double right = start + step;BM(left, right, eps1, eps2);}return 0;}运行:Please input A,B,C:6 -40 9Please input a,b, step, eps1,eps2:-10 10 1 1e-5 1e-5Finding root in the range: [-3.000, -2.000]The x value is:-2.53643f(x)=-0.00124902Finding root in the range: [-1.000, 0.000]The x value is:-0.482857f(x)=0.00012967Finding root in the range: [0.000, 1.000]The x value is:0.482857f(x)=0.00012967Finding root in the range: [2.000, 3.000]The x value is:2.53643f(x)=-0.00124902有时若把判别语句if(fabs(xe)<eps2 || fabs(f(x))<eps1)改为if(fabs(xe)<eps2 && fabs(f(x))<eps1)会提高精度,对同一题运行结果:Finding root in the range: [-3.000, -2.000]The x value is:-2.53644f(x)=-4.26496e-007Finding root in the range: [-1.000, 0.000]The x value is:-0.482861f(x)=-7.3797e-006Finding root in the range: [0.000, 1.000]The x value is:0.482861f(x)=-7.3797e-006Finding root in the range: [2.000, 3.000]The x value is:2.53644f(x)=-4.26496e-007习题2-35. 请用埃特金方法编程求出x=tgx在4.5(弧度)附近的根。
C语言数值计算举例

h=(b-a)/n; s=(f(a)+f(b))/2; for( i=1;i<n;i++) { x=a+i*h; s=s+f(x); } s=s*h; printf("the value is :%f",s); }
程序运行结果为: please input n: 100↙ the value is : 2.525219
6
数值计算
例3 若矩阵A是m行n列的实矩阵,矩阵B是n行p 列的实矩阵,求C=A*B。 算法及分析: 矩阵乘积的计算公式为:
cij aik bkj
k 1 n
i 1, , m; j 1, , p 2, 2,
7
数值计算
#define M 4 #define N 3 #define P 2 main ( ) { int i,j,k; int a[M+1][N+1],b[N+1][P+1],c[M+1][P +1]; printf("please input matrix A:\n"); for(i=1;i<=M;i++) for(j=1;j<=N;j++) scanf ("%d",&a[i][j]); printf("please input matrix B:\n"); for(i=1;i<=N;i++) for(j=1;j<=P;j++) scanf ("%d",&b[i][j]);
5
数值计算
#define PI 3.1415926 float f(float x) { float y; y=1/(1+x*x); return y; } main( ) { int i, j, n; float x,h,a,b,s; b=PI; a=-PI; printf("please input n:"); scanf(" %d ",&n);
数值分析实验程序C语言
Y=Y+r*y[i];}
printf("%lf\n",Y);
}
2牛顿插值:
#include<stdio.h>
#define N 6
void main()
{
int i,k,n=N-1;
float X,Y,x[N],y[N],c[N],b[N];
printf("请输入xi:\n");
for(i=0;i<N;i++)
int k,N;
double x0,x1;
printf("请输入x0,N\n");
scanf("%lf,%d",&x0,&N);
for(k=1;k<=N;k++)
{
if(fd(x0)==0){printf("奇异标志\n");break;}
x1=x0-(f(x0)/fd(x0));
printf("X%d= %lf\n",k,x1);
}
}
float f(float x,float y)
{
float s;
s=y-(2*x)/y;
return s;
}
5牛顿迭代法:
#include<stdio.h>
#include<math.h>
#define e 1e-7
void main()
{
double f(double x);
double fd(double x);
1拉格朗日插值:
#include<stdio.h>
#define N 3
数值分析算法C语言程序
数值分析算法C语言程序数值分析是研究数学问题的近似解法的一门学科,其中包括了各种数值方法和算法。
本文将介绍数值分析中的常见算法,并给出相应的C语言程序。
1.二分法(Bisection Method)二分法是一种求函数零点的简单且常用的方法。
该方法的基本思想是通过不断将区间进行二分,并比较中点处函数值的正负来找到零点所在的区间。
```c#include <stdio.h>double f(double x)return x * x - 2;double bisection(double a, double b, double eps)double c;while ((b - a) > eps)c=(a+b)/2;if (f(c) == 0)break;}else if (f(a) * f(c) < 0)b=c;}elsea=c;}}return c;int maidouble a = 0.0;double b = 2.0;double result = bisection(a, b, eps);printf("The root is: %lf\n", result);return 0;```2.牛顿迭代法(Newton's Method)牛顿迭代法是一种高效的求函数零点的方法。
该方法的基本思想是通过对函数进行线性逼近,不断逼近函数的零点。
```c#include <stdio.h>#include <math.h>double f(double x)return x * x - 2;double df(double x)return 2 * x;double newton(double x0, double eps) double x = x0;double deltaX = f(x) / df(x);while (fabs(deltaX) > eps)deltaX = f(x) / df(x);x = x - deltaX;}return x;int maidouble x0 = 2.0;double result = newton(x0, eps); printf("The root is: %lf\n", result); return 0;```3.高斯消元法(Gaussian Elimination)高斯消元法是一种用于求解线性方程组的方法。
计算方法数值分析C语言源程序
第1章线性方程组的直接算法求解线性方程组的直接算法是基于矩阵分解的算法。
常见的矩阵分解有两种:1.矩阵的三角分解矩阵的三角就是把一个矩阵分解成两个三角形矩阵的乘积。
比如:简单的三角分解:,这里,是单位下三角矩阵,是上三角矩阵。
列主元三角分解:,这里,是初等置换阵,是单位下三角矩阵且各元素的模不超过1,是上三角矩阵。
全主元三角分解:,这里,,是初等置换阵,是单位下三角矩阵且元素的模不超过,是上三角矩阵。
2.矩阵的正交三角分解正交化三角化就是把一个矩阵分解成一个正交矩阵和一个上三角矩阵的乘积.即,这里是正交矩阵,是上三角矩阵.1.1 矩阵的三角分解1.1.1 功能把实矩阵分解成单位下三角形矩阵和上三角形矩阵的乘积.即.该算法适用于各阶顺序主子式不等于的矩阵.1.1.2 算法概述所谓三角分解就是把阶方阵作如下分解其中是单位下三角矩阵,上三角矩阵。
当时,构造Gauss变换则以此类推,只要对角线上的元素,便可以一直这样做下去。
直到将其化为上三角矩阵为止。
即有.其中,且从而有而且.综上所述,我们可以将两个矩阵因子继续存储在原矩阵的存储空间上.的主对角线上的1不予存储.算法5.3(计算三角分解:Gauss消去法)1.1.3 算法程序1.1.3.1.1 参数说明**a n阶矩阵; n 矩阵的阶;1.1.3.1.2 C程序bool GaussLU(double **a,int n)//n阶矩阵的LU分解{for(int k=0;k<n-1;k++){if(a[k][k]==0)return false;for(int i=k+1;i<n;i++){a[i][k]/=a[k][k];for(int j=k+1;j<n;j++)a[i][j]-=a[i][k]*a[k][j];}}return true;}1.1.4 例题求矩阵1 2 3 41 4 9 161 8 27 64的三角分解,结果如下:1 2 3 41 2 6 121 3 6 241 7 6 241.2 列主元三角分解1.2.1 功能用矩阵的列主元三角分解,分解矩阵:,这里,是初等置换阵,是单位下三角矩阵且各元素的模不超过1,是上三角矩阵。
c语言有关于数的编程题汇总
c语言有关于数的编程题汇总
当涉及到C语言编程中与数相关的题目时,有许多不同类型的
题目可以涵盖。
以下是一些常见的数学编程题目的汇总,它们涵盖
了不同的概念和技巧:
1. 判断质数,编写一个程序,判断一个给定的整数是否为质数。
质数是只能被1和自身整除的数。
2. 斐波那契数列,编写一个程序,打印斐波那契数列的前n个
数字。
斐波那契数列是一个每个数字都是前两个数字之和的数列。
3. 最大公约数和最小公倍数,编写一个程序,计算两个给定整
数的最大公约数和最小公倍数。
4. 逆序数字,编写一个程序,将一个给定的整数逆序输出。
例如,输入12345,输出54321。
5. 阶乘计算,编写一个程序,计算一个给定整数的阶乘。
阶乘
是从1到该数的连续乘积。
6. 素数间距,编写一个程序,找到给定范围内的所有素数对,并计算它们之间的间距。
素数对是指相邻的两个素数。
7. 找出最大和最小数字,编写一个程序,从给定的一组数字中找出最大和最小的数字。
8. 简单计算器,编写一个程序,实现简单的加法、减法、乘法和除法运算。
9. 数字猜谜游戏,编写一个程序,生成一个随机数,并提示用户猜测该数字,直到猜中为止。
10. 十进制转二进制,编写一个程序,将一个给定的十进制数转换为二进制表示。
以上只是一些常见的数学编程题目,你可以根据自己的需求和兴趣选择适合的题目进行练习。
同时,还可以通过使用循环、条件语句、函数等C语言的特性来解决这些问题。
希望这些题目能够帮助你加深对C语言的理解和掌握。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用C语言编写数值分析作业题:(包括高斯消元法,二分法,迭代法,牛顿迭代法)
1.二分法
#include "stdio.h"
#include "conio.h"
#include
#include
#define f(x) (x*x*x-3*x+1)
void main()
{
float eve,a,b,E=0.0001;
float function(float x);
printf("please put a:");
scanf("%f",&a);
printf("please put b:");
scanf("%f",&b);
if(f(a)*f(b)>=0)
printf("no answer");
eve=(a+b)/2;
while(fabs(f(eve))>E)
{
printf("a=%f\t",a);
printf("b=%f\t",b);
eve=(a+b)/2;
printf("eve=%f\t",eve);
printf("f(eve)=%f\n",f(eve));
if(f(eve)==0)break;
if(f(a)*f(eve)<0)
b=eve;
else
a=eve;
}
printf("the answer is:\n");
printf("%f\t",eve);
return;
}
2.高斯消元法
#include "stdio.h"
#include "conio.h"
#include
void main()
{ /* 定义各量 */
int n;
int i,j,k,t,d,xpt=0;
float sum,max,p,q,h;
float a[100][100],b[100],x[100],xp[100],l[100][100];
printf("please put n:\n");
scanf("%d",&n);
printf("please put a:");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%f",&a[i][j]);
printf("please put b:");
for(i=1;i<=n;i++)
scanf("%f",&b[i]);
for(k=1;k<=n-1;k++)
{
for(i=k+1;i<=n;i++)
{ if(a[k][k]!=0) l[i][k]=a[i][k]/a[k][k];
else printf("no answer\n");
a[i][k]=0;
for(j=k+1;j<=n;j++)
{a[i][j]=a[i][j]-l[i][k]*a[k][j];
}
b[i]=b[i]-l[i][k]*b[k];
}
}
if(a[n][n]==0){printf("no answer\n");}
else
{
x[n]=b[n]/a[n][n];
for(i=n-1;i>=1;i--)
{
sum=0;
for(j=i+1;j<=n;j++)
sum=sum+a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
}
}
printf("the answer is:\n");
for(i=1;i<=n;i++)
printf("%f\t",x[i]);
return;
}
3.迭代法
#include
#include
#include "conio.h"
#include
double func(double x) /*函数*/
{return pow(x,3)+4*x*x-10;}
double func1(double x) /*g1(x)*/
{return x-pow(x,3)-4*x*x+10;}
double func2(double x) /*g2(x)*/
{ if((10/x-4*x)<0){ printf("no sence\n");return 1000;}
return sqrt(10/x-4*x);}
double func3(double x) /*g3(x)*/
{if((10-pow(x,3))<0){ printf("no sence\n");return 1000;}
return sqrt(10-pow(x,3))/2;
}
double func4(double x) /*g4(x)*/
{ if((10/(4+x))<0){ printf("no sence\n");return 1000;}
return sqrt(10/(4+x));}
double func5(double x) /*g5(x)*/
{return x-((pow(x,3)+4*x*x-10)/(3*x*x+8*x));}
void main()
{
int i;
double x[30],p;
/*
p=1.5;
printf("g1(x):\n");
for(i=0;i<=25;i++)
{
x[i]=p;
printf("%f\n",x[i]);
p=func1(x[i]);
if(p>5||p<-2)
{printf("no convergence or wrong\n");break; }
}
printf("\n\n");
p=1.5;
printf("g2(x):\n");
for(i=0;i<=25;i++)
{
x[i]=p;
printf("%f\n",x[i]);
p=func2(x[i]);
if(p>5||p<-2||p==0)
{printf("no convergence or wrong\n");break; }
}
printf("\n\n");
p=1.5;
printf("g3(x):\n");
for(i=0;i<=25;i++)
{
x[i]=p;
printf("%f\n",x[i]);
p=func3(x[i]);
if(p>5||p<-2)
{printf("no convergence or wrong\n");break; }
}
printf("\n\n");
p=1.5;
printf("g4(x):\n");
for(i=0;i<=10;i++)
{
x[i]=p;
printf("%f\n",x[i]);
p=func4(x[i]);
if(p>5||p<-2)
{printf("no convergence or wrong\n");break; }
}
printf("\n\n");
*/
p=1.5;
printf("g5(x):\n");
for(i=0;i<=10;i++)
{
x[i]=p;
printf("%f\n",x[i]);
p=func5(x[i]);
if(p>5||p<-2)
{printf("no convergence or wrong\n");break; }
}
getch();
}
4.牛顿迭代法
#include
#include
double func(double x)
{return pow(x,5)-4*x-2 ; }
double func1(double x)
{return 5*pow(x,4)-4 ; }
double root(double num)
{ double x0,x1;
int k=1;
x0=num;
if(func1(x0)==0.0)
{printf("迭代过程中导数为0!\n");return x0;}
printf("k=%d\t",k); k++;
printf("xk=%lf\n",x0);
x1=x0-func(x0)/func1(x0);
do
{
printf("k=%d\t",k);
printf("xk=%lf\n",x1);
k++;
x0=x1;
x1=x0-func(x0)/func1(x0);
} while((fabs(x1-x0))>1e-6);
printf("the root near 1.5 is:%lf\n",x1);
return x1;
}
void main()
{
root( 2 ) ;
}