当前位置:文档之家› 数值分析第三次大作业

数值分析第三次大作业

数值分析第三次大作业
数值分析第三次大作业

《数值分析》计算实习报告

第三题

院系:机械工程及自动化学院

学号:

姓名:

2017年12月

一、题目要求

关于x, y, t, u, v, w 的下列方程组(A.3)

0.5cos 2.670.5sin 1.070.5cos 3.740.5sin 0.79

t u v w x t u v w y t u v w x t u v w y +++-=??+++-=?

?

+++-=??+++-=? (A.3) 以及关于z, t, u 的下列二维数表确定了一个二元函数(,)z f x y =。

1、试用数值方法求出f(x, y)在区域 {(,)|00.8,0.5 1.5}D x y x y =≤≤≤≤上的一个近似表达式

00(,)k

k

r s rs r s p x y c x y ===∑∑

要求(,)p x y 以最小的k 值达到以下的精度

10

20

2700((,)(,))10i j i j i j f x y p x y σ-===-≤∑∑

其中,0.08,0.50.05i j x i y j ==+。

2、计算****

(,),(,)i j i j f x y p x y (i = 1, 2, …,

8;j = 1, 2,…,5)的值,以观察(,)p x y 逼近(,)f x y 的效果,其中,*i x =0.1i , *j y =0.5+0.2j 。

说明:

1、用迭代方法求解非线性方程组时,要求近似解向量()k x 满足

()(1)()12||||/||||10k k k x x x --∞∞-≤

2、作二元插值时,要使用分片二次代数插值。

3、要由程序自动确定最小的k 值。

4、打印以下内容: (1)全部源程序;

(2)数表:(,,i j x y (,)i j f x y )(i = 0,1,2,…,10;j = 0,1,2,…,20); (3)选择过程的,k σ值;

(4)达到精度要求时的,k σ值以及(,)p x y 中的系数rs c (r = 0,1,…,k ;s = 0,1,…,k );

(5)数表:(**,,i j x y ****(,),(,)i j i j f x y p x y )

(i = 1, 2, …,8;j = 1, 2,…,5); 5、采用f 型输出,,i j x y **,i j x y 的准确值,其余实型数采用e 型输出并且至少显示12位有效数字。

二、算法设计思路和方案

1、解非线性方程组

方程组(A.3)由四个方程组成,又为六元方程组,则给(x,y )赋一组值,即能解出一组(t,u,v,w )。依次代入x i =0.08i ,y j =0.5+0.05j (其中i =0,1,…,10; j =0,1,…,20),利用Newton 迭代法解得对应的(t ij ,u ij )。

Newton 迭代法解方程组()0F x =的解*x ,可采用如下算法:

(1)在*x 附近选取(0)x D ∈,给定精度水平0ε>和最大迭代次数M 。 (2)对于0,1,

k M =执行

①计算()()k F x 和()()k F x '。 ②求解关于()k x ?的线性方程组

()()()()()k k k F x x F x '?=-

③若()

()

k k x x ε∞

?≤,则取*()k x x ≈,并停止计算;否则转④。

④计算(1)()()k k k x x x +=+?。

⑤若k M <,则继续,否则,输出M 次迭代不成功的信息,并停止计算。 2、分片二次代数插值

利用二维数表进行分片二次代数插值,得到函数z =z(t,u)。对于区域D 内任意(x,y ),代入方程组(A.3)解得(t,u),再代入函数z =z(t,u),此从(x,y )到z 的映射即为二元函数 z =f(x,y)。

给定已知数表以及需要插值的节点,进行分片二次插值的算法:

设已知数表中的点为:00(0,1,,)(0,1,,)i j

x x ih i n y y j j m τ=+=???

=+=?? ,需要插值的节点为(,)x y 。 (1)根据(,)x y 选择插值节点(,)i j x y : 若12h x x ≤+

或12

n h

x x ->-,插值节点对应取1i =或1i n =-, 若12y y τ≤+或12

n y y τ

->-,插值节点对应取1j =或1i m =-。

若,2222,2222

i i j j h h x x x i n y y y j m ττ?-<≤+≤≤-????-<≤+≤≤-??

则选择(,)(1,,1;1,,1)k r x y k i i i r j j j =-+=-+为插值节点。

(2)计算

1

11

1()(1,,1)

()(1,,1)i t

k t i k t

t k j t

r t j r t

t r

x x l x k i i i x x y y l y r j j j y y +=-≠+=-≠-==-+--=

=-+-∏

插值多项式的公式为:

1

111

(,)()()(,)j i k

r

k

r

k i r j p x y l x l y f x y ++=-=-=

∑∑

注:本步进行插值运算的是(,)t u ,利用(,)i j x y 与(,)t u 的对应关系就可以得到z 与(,)i j x y 的对应关系。

3、曲面拟合

将1中得到的(t ij ,u ij )代入函数z =z(t,u),得到z ij =f(x i ,y j )。利用最小二乘法进行拟合,得到,0

(,)k

r s rs

r s p x y c

x y ==

∑,其中使k 依次取1,2,…直到使拟合函数

满足10

20

2700

((,)(,))10i j i j i j f x y p x y σ-===-≤∑∑,则所取k 为满足条件的最小值。

根据插值得到的数表,,(,)i j i j x y f x y 进行曲面拟合的过程: (1)根据拟合节点和基底函数写出矩阵B 和G :

01000011

1101

()()()()()()()()()k k k n

n n x x x x x x B x x x ??

? ?= ? ? ??? 01

0000

11110

1

()()()()

()()()()()k k k m

m m y y y y y y G y y y ??

? ?

= ? ? ???

(2)计算 11()()T T T C B B B UG G G --=。 (3)对于每一个(,)i j x y ,

*

00(,)()()k

k

r s i j rs i j r s p x y C x y ===∑∑

拟合需要达到的精度条件为:

*2700

[(,)]10n m

i j ij i j p x y u σ-===-≤∑∑

其中ij u 对应着插值得到的数表,,(,)i j i j x y f x y 中(,)i j f x y 的值。

让k 逐步增加,每一次重复执行以上几步,直到710σ-≤ 成立。此时的k 值就是要求解最小的k 。

4、观察(,)p x y 逼近(,)f x y 的效果

同1、2步,代入*i x =0.1i , *j

y =0.5+0.2j ,(i = 1, 2, …,8;j = 1, 2,…,5),得到**(,)i j f x y ;将**(,)i j x y 代入(,)p x y ,得到**(,)i j p x y 。比较两函数值,观察(,)p x y 逼近(,)f x y 的效果。

三、源程序代码

#include "stdio.h" #include "math.h" #include "stdlib.h"

#define N 4 #define L 11 #define M 21

int main() { void ntsl(double x, double y, double a[N]);

//Newton 迭代解方程组函数

void gsslm(double a[M][M], double b[M], double x[M], int n); void gssln(double a[N][N], double b[N], double x[N]); //列主元gauss 迭代 void fcfz(double a[N], double f[N], double x, double y); //方程组赋值函数 void fcds(double a[N], double ff[N][N]); //方程导数矩阵函数 double amul(double a[N], double b[N]); //向量内积函数 double fpcz(double t0[3], double u0[3], double z0[3][3], double t, double u);//二次分片插值函数 void atra(double a[M][M], int n, int m, double at[M][M]); //矩阵转置 void aamu(double a[M][M], int n, int m, int s, double b[M][M], double c[M][M]);//矩阵相乘 void aqni(double a[M][M], int n, double ani[M][M]); //矩阵求逆 double pxy(double x, double y, double c[M][M], int k); //求p(x,y) void zxec(int l, int m, double u[L][M], double x[L], double y[M], double c[M][M]);//最小二乘 double ztu(double t, double u, double z00[6][6]); //求z(t,u) double tuvw[N] = { 1, 1, 1, 1 }; //方程组迭代赋初值

double x; double y;

double z[L][M]; int k0;

double c[M][M] = { 0 }; double x1[L];

double y1[M];

double z00[6][6] = { { -0.5, -0.34, 0.14, 0.94, 2.06, 3.5 },

{ -0.42, -0.5, -0.26, 0.3, 1.18, 2.38 },

{ -0.18, -0.5, -0.5, -0.18, 0.46, 1.42 },

{ 0.22, -0.34, -0.58, -0.5, -0.1, 0.62 },

{ 0.78, -0.02, -0.5, -0.66, -0.5, -0.02 },

{ 1.5, 0.46, -0.26, -0.66, -0.74, -0.5 } };

for (int i = 0; i < L; i++)

{

for (int j = 0; j < 7; j++)

{

if (i == 0)

{

if (j == 0)p rintf("x-y ");

printf(" %1.2lf ", 0.5 + 0.05*j);

if (j == 6)p rintf("\n");

}

}

for (int j = 0; j < 7; j++)

{

x = 0.08*i;

y = 0.5 + 0.05*j;

ntsl(x, y, tuvw);

z[i][j] = ztu(tuvw[0], tuvw[1], z00);

if (j == 0)p rintf("%1.2lf ", 0.08*i);

printf("% 1.11e ", z[i][j]);

if (j == 6)p rintf("\n");

}

if (i == 10)printf("\n");

}

for (int i = 0; i < L; i++)

{

for (int j = 7; j < 14; j++)

{

if (i == 0)

{

if (j == 7)p rintf("x-y ");

printf(" %1.2lf ", 0.5 + 0.05*j);

if (j == 13)printf("\n");

}

}

for (int j = 7; j < 14; j++)

{

x = 0.08*i;

y = 0.5 + 0.05*j;

ntsl(x, y, tuvw);

z[i][j] = ztu(tuvw[0], tuvw[1], z00);

if (j == 7)p rintf("%1.2lf ", 0.08*i);

printf("% 1.11e ", z[i][j]);

if (j == 13)printf("\n");

}

if (i == 10)printf("\n");

}

for (int i = 0; i < L; i++)

{

for (int j = 14; j < 21; j++)

{

if (i == 0)

{

if (j == 14)printf("x-y ");

printf(" %1.2lf ", 0.5 + 0.05*j);

if (j == 20)printf("\n");

}

}

for (int j = 14; j < 21; j++)

{

x = 0.08*i;

y = 0.5 + 0.05*j;

ntsl(x, y, tuvw);

z[i][j] = ztu(tuvw[0], tuvw[1], z00);

if (j == 14)printf("%1.2lf ", 0.08*i);

printf("% 1.11e ", z[i][j]);

if (j == 20)printf("\n");

}

if (i == 10)printf("\n");

}

for (int i = 0; i < L; i++)

x1[i] = 0.08*i;

for (int i = 0; i < M; i++)

y1[i] = 0.5 + 0.05*i;

//最小二乘法拟合+循环确定满足条件k值

for (int k = 0; k < L - 1; k++)

{

double sum1[L][M] = { 0 };

double sum2 = 0;

zxec(k, k, z, x1, y1, c);

for (int i = 0; i < L; i++)

{

for (int j = 0; j < M; j++)

{

for (int r = 0; r < k + 1; r++)

{

for (int s = 0; s < k + 1; s++)

{

if ((r == 0) && (i == 0))

sum1[i][j] = sum1[i][j] + c[r][s] * 1 * pow(y1[j], s);

else

sum1[i][j] = sum1[i][j] + c[r][s] * pow(x1[i], r)*pow(y1[j], s);

}

}

sum2 = sum2 + pow((sum1[i][j] - z[i][j]), 2);

}

}

printf("k=%d ", k);

printf("σ=%1.11e\n", sum2);

if (sum2 < (1e-7))

{

printf("k=%d\n", k);

k0 = k;

break;

}

if (k == L - 2)printf("拟合失败\n");

}

for (int i = 0; i < 6; i++)

{

for (int j = 0; j < 6; j++)

{

printf("% .11e ", c[i][j]);

if (j == 5)p rintf("\n");

}

}

for (int i = 1; i < 9; i++)//求f(x*,y*)

{

if (i == 1)p rintf("x-y-f ");

for (int j = 1; j < 6; j++)

{

if (i == 1)

{

printf(" %.2lf ", 0.5 + 0.2*j);

if (j == 5)p rintf("\n");

}

}

printf("%.2lf ", 0.1*i);

for (int j = 1; j < 6; j++)

{

x = 0.1*i;

y = 0.5 + 0.2*j;

ntsl(x, y, tuvw);

printf("% .11e ", ztu(tuvw[0], tuvw[1], z00));

if (j == 5)p rintf("\n");

}

}

printf("\n");

//求p(x*,y*)

for (int i = 1; i < 9; i++)

{

if (i == 1)p rintf("x-y-p ");

for (int j = 1; j < 6; j++)

{

if (i == 1)

{

printf(" %.2lf ", 0.5 + 0.2*j);

if (j == 5)p rintf("\n");

}

}

printf("%.2lf ", 0.1*i);

for (int j = 1; j < 6; j++)

{

x = 0.1*i;

y = 0.5 + 0.2*j;

printf("% .11e ", pxy(x, y, c, k0));

if (j == 5)p rintf("\n");

}

}

return 0;

}

void gssln(double a[N][N], double b[N], double x[N])

{

double ai[N];

double bi;

for (int i = 0; i < N; i++)

x[i] = 0;

for (int k = 0; k < N; k++)

{

double max = 0;

int s = 0;

double m[N] = { 0 };

for (int i = k; i < N; i++)

{

if (max < fabs(a[i][k]))

{

max = fabs(a[i][k]);

s = i;

}

}

for (int i = 0; i < N; i++)

{

ai[i] = a[k][i];

a[k][i] = a[s][i];

a[s][i] = ai[i];

}

bi = b[k];

b[k] = b[s];

b[s] = bi;

for (int i = k + 1; i < N; i++)

{

m[i] = a[i][k] / a[k][k];

for (int j = k + 1; j < N; j++)

a[i][j] = a[i][j] - m[i] * a[k][j];

b[i] = b[i] - m[i] * b[k];

}

}

x[N - 1] = b[N - 1] / a[N - 1][N - 1];

for (int k = N - 2; k > -1; k--)

{

for (int j = k + 1; j < N; j++)

{

x[k] = x[k] + x[j] * a[k][j];

}

x[k] = b[k] / a[k][k] - x[k] / a[k][k];

}

}

void fcfz(double a[N], double f[N], double x, double y) {

f[0] = cos(a[0]) / 2 + a[1] + a[2] + a[3] - 2.67 - x;

f[1] = a[0] + sin(a[1]) / 2 + a[2] + a[3] - 1.07 - y;

f[2] = a[0] / 2 + a[1] + cos(a[2]) + a[3] - 3.74 - x;

f[3] = a[0] + a[1] / 2 + a[2] + sin(a[3]) - 0.79 - y;

}

void fcds(double a[N], double ff[N][N])

{

for (int i = 0; i < N; i++)

{

for (int j = 0; j < N; j++)

ff[i][j] = 1;

}

ff[0][0] = 0 - sin(a[0]) / 2;

ff[1][1] = cos(a[1]) / 2;

ff[2][0] = 0.5;

ff[2][2] = 0 - sin(a[2]);

ff[3][1] = 0.5;

ff[3][3] = cos(a[3]);

}

void ntsl(double x, double y, double a[N])

{

double f[N] = { 0 };

double ff[N][N];

double deta[N] = { 0 };

int q = 0;

for (int s = 0; s < 10000; s++)

{

fcfz(a, f, x, y);

fcds(a, ff);

double f1[N];

for (int i = 0; i < N; i++)

{

f1[i] = 0 - f[i];

}

gssln(ff, f1, deta);//求解线性方程组

for (int i = 0; i < N; i++)

a[i] = a[i] + deta[i];

for (int i = 0; i < N; i++)

{

if (fabs(deta[i]) / fabs(a[i]) > 1e-12)break;

if (i == 3)q = 1;

if (q == 1)break;

if (s == 9999)

{

printf("方程迭代失败\n");

system("pause");

}

}

}

double amul(double a[N], double b[N])

{

double r = 0;

for (int i = 0; i < N; i++)

r = r + a[i] * b[i];

return r;

}

double fpcz(double t0[3], double u0[3], double z0[3][3], double t, double u) {

double lt[3] = { 1, 1, 1 };

double lu[3] = { 1, 1, 1 };

double fi[3][3];

double z = 0;

for (int k = 0; k < 3; k++)

{

for (int i = 0; i < 3; i++)

{

if (i != k)

{

lt[k] = lt[k] * (t - t0[i]) / (t0[k] - t0[i]);

lu[k] = lu[k] * (u - u0[i]) / (u0[k] - u0[i]);

}

}

}

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

fi[i][j] = lt[i] * lu[j];

z = z + fi[i][j] * z0[i][j];

}

}

}

double ztu(double t, double u, double z00[6][6])

{

double z;

int s;

int q;

double t0[3];

double u0[3];

double z0[3][3];

if (t < 0.1)s = 1;

else

{

if (t > 0.9)s = 4;

else s = (t + 0.1) / 0.2;

}

for (int r = 0; r<3; r++)

t0[r] = 0.2*(s + r - 1);

if (u < 0.2)q = 1;

else

{

if (u > 1.8)q = 4;

else q = (u + 0.2) / 0.4;

}

for (int r = 0; r<3; r++)

u0[r] = 0.4*(q + r - 1);

for (int r = 0; r < 3; r++)

{

for (int k = 0; k < 3; k++)

z0[r][k] = z00[s + r - 1][q + k - 1];

}

z = fpcz(t0, u0, z0, t, u);

return z;

}

void aamu(double a[M][M], int n, int m, int s, double b[M][M], double c[M][M]) {

for (int i = 0; i < M; i++)

for (int j = 0; j < M; j++)

c[i][j] = 0;

for (int i = 0; i < n; i++)

{

for (int j = 0; j < s; j++)

{

for (int k = 0; k < m; k++)

{

c[i][j] = c[i][j] + a[i][k] * b[k][j];

}

}

}

}

void atra(double a[M][M], int n, int m, double at[M][M])

{

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

at[j][i] = a[i][j];

}

}

}

void gsslm(double a[M][M], double b[M], double x[M], int n) {

double ai[M];

double bi;

for (int i = 0; i < M; i++)

x[i] = 0;

for (int k = 0; k < n; k++)

{

double max = 0;

int s = 0;

double m[M] = { 0 };

for (int i = k; i < n; i++)

{

if (max < fabs(a[i][k]))

{

max = fabs(a[i][k]);

s = i;

}

}

for (int i = 0; i < n; i++)

{

ai[i] = a[k][i];

a[k][i] = a[s][i];

a[s][i] = ai[i];

}

bi = b[k];

b[k] = b[s];

b[s] = bi;

for (int i = k + 1; i < n; i++)

{

m[i] = a[i][k] / a[k][k];

for (int j = k + 1; j < n; j++)

a[i][j] = a[i][j] - m[i] * a[k][j];

b[i] = b[i] - m[i] * b[k];

}

}

x[n - 1] = b[n - 1] / a[n - 1][n - 1];

for (int k = n - 2; k > -1; k--)

{

for (int j = k + 1; j < n; j++)

{

x[k] = x[k] + x[j] * a[k][j];

}

x[k] = b[k] / a[k][k] - x[k] / a[k][k];

}

}

void aqni(double a[M][M], int n, double ani[M][M])

{

double I[M][M] = { 0 };

double anit[M][M] = { 0 };

for (int i = 0; i < M; i++)

I[i][i] = 1;

for (int i = 0; i < n; i++)

{

double a1[M][M];

for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

a1[i][j] = a[i][j];

gsslm(a1, I[i], anit[i], n);

}

atra(anit, n, n, ani);

}

void zxec(int l, int m, double u[L][M], double x[L], double y[M], double c[M][M]) {

double b[M][M] = { 0 };

double g[M][M] = { 0 };

for (int i = 0; i < L; i++)

{

for (int j = 0; j < l + 1; j++)

{

if ((i == 0) && (j == 0))b[i][j] = 1;

else b[i][j] = pow(x[i], j);

}

}

for (int i = 0; i < M; i++)

{

for (int j = 0; j < m + 1; j++)

{

g[i][j] = pow(y[i], j);

}

}

double bt[M][M] = { 0 };

double gt[M][M] = { 0 };

atra(b, L, l + 1, bt);

atra(g, M, m + 1, gt);

double btb[M][M] = { 0 };

double gtg[M][M] = { 0 };

aamu(bt, l + 1, L, l + 1, b, btb);

aamu(gt, m + 1, M, m + 1, g, gtg);

aqni(btb, l + 1, b);

aqni(gtg, m + 1, gt);

aamu(b, l + 1, l + 1, L, bt, btb);

aamu(g, M, m + 1, m + 1, gt, gtg);

aamu(btb, l + 1, L, M, u, b);

aamu(b, l + 1, M, m + 1, gtg, c);

}

double pxy(double x, double y, double c[M][M], int k) {

double p = 0;

for (int r = 0; r < k + 1; r++)

{

for (int s = 0; s < k + 1; s++)

p = p + c[r][s] * pow(x, r)*pow(y, s);

}

return p;

}

四、计算结果

1、数表:(,,i j x y (,)i j f x y )(i = 0,1,2,...,10;j = 0,1,2, (20)

2、选择过程的,k 值

3、最终k 应为5,此时c rs 矩阵如下

4、数表:(**,,i j x y ****

(,),(,)

i j i j f x y p x y )(i = 1, 2, ...,8;j = 1, 2, (5)

五、结果分析与讨论

从插值得到的f(x,y)函数开始(包括其在内),所得到计算结果与课本答案存在1e-9左右的差异。经验证,并不是迭代初值的选择所导致的。

数值分析大作业-三、四、五、六、七

大作业 三 1. 给定初值 0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用 程序. 解:Matlab 程序如下: 函数m 文件:fu.m function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件:dfu.m function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序Newton.m clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:'); flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

while flag1==1 && m<=10^3 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)=ep flag=0; end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +??=-= ?-???解:Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1; while nerrorlim n=n+1; else break ; end x0=x; end disp(['迭代次数: n=',num2str(n)]) disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)]) (2)子函数 非线性函数f function y=f(x) y=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918); end

北航数值分析大作业一

《数值分析B》大作业一 SY1103120 朱舜杰 一.算法设计方案: 1.矩阵A的存储与检索 将带状线性矩阵A[501][501]转存为一个矩阵MatrixC[5][501] . 由于C语言中数组角标都是从0开始的,所以在数组MatrixC[5][501]中检索A的带内元素a ij的方法是: A的带内元素a ij=C中的元素c i-j+2,j 2.求解λ1,λ501,λs ①首先分别使用幂法和反幂法迭代求出矩阵按摸最大和最小的特征值λmax和λmin。λmin即为λs; 如果λmax>0,则λ501=λmax;如果λmax<0,则λ1=λmax。 ②使用带原点平移的幂法(mifa()函数),令平移量p=λmax,求 出对应的按摸最大的特征值λ,max, 如果λmax>0,则λ1=λ,max+p;如果λmax<0,则λ501=λ,max+p。 3.求解A的与数μk=λ1+k(λ501-λ1)/40的最接近的特征值λik (k=1,2,…,39)。 使用带原点平移的反幂法,令平移量p=μk,即可求出与μk最接近的特征值λik。 4.求解A的(谱范数)条件数cond(A)2和行列式d etA。 ①cond(A)2=|λ1/λn|,其中λ1和λn分别是矩阵A的模最大和 最小特征值。

②矩阵A的行列式可先对矩阵A进行LU分解后,detA等于U所有对角线上元素的乘积。 二.源程序 #include #include #include #include #include #include #include #define E 1.0e-12 /*定义全局变量相对误差限*/ int max2(int a,int b) /*求两个整型数最大值的子程序*/ { if(a>b) return a; else return b; } int min2(int a,int b) /*求两个整型数最小值的子程序*/ { if(a>b) return b; else return a; } int max3(int a,int b,int c) /*求三整型数最大值的子程序*/ { int t; if(a>b) t=a; else t=b; if(t

数值分析大作业三 四 五 六 七

大作业 三 1. 给定初值 0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用程序. 解:Matlab 程序如下: 函数m 文件:fu.m function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件:dfu.m function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序Newton.m clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:');

flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

while flag==1 sigma=k*eps; x0=sigma; k=k+1; m=0; flag1=1; while flag1==1 && m<=10^3 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)=ep flag=0;

end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +?? =-= ?-???解: Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1;

数值分析作业答案

数值分析作业答案 插值法 1、当x=1,-1,2时,f(x)=0,-3,4,求f(x)的二次插值多项式。 (1)用单项式基底。 (2)用Lagrange插值基底。 (3)用Newton基底。 证明三种方法得到的多项式是相同的。 解:(1)用单项式基底 设多项式为: , 所以: 所以f(x)的二次插值多项式为: (2)用Lagrange插值基底 Lagrange插值多项式为: 所以f(x)的二次插值多项式为: (3) 用Newton基底: 均差表如下: xk f(xk) 一阶均差二阶均差 1 0 -1 -3 3/2 2 4 7/ 3 5/6 Newton插值多项式为: 所以f(x)的二次插值多项式为: 由以上计算可知,三种方法得到的多项式是相同的。 6、在上给出的等距节点函数表,若用二次插值求ex的近似值,要使截断误差不超过10-6,问使用函数表的步长h应取多少? 解:以xi-1,xi,xi+1为插值节点多项式的截断误差,则有 式中 令得 插值点个数

是奇数,故实际可采用的函数值表步长 8、,求及。 解:由均差的性质可知,均差与导数有如下关系: 所以有: 15、证明两点三次Hermite插值余项是 并由此求出分段三次Hermite插值的误差限。 证明:利用[xk,xk+1]上两点三次Hermite插值条件 知有二重零点xk和k+1。设 确定函数k(x): 当或xk+1时k(x)取任何有限值均可; 当时,,构造关于变量t的函数 显然有 在[xk,x][x,xk+1]上对g(x)使用Rolle定理,存在及使得 在,,上对使用Rolle定理,存在,和使得 再依次对和使用Rolle定理,知至少存在使得 而,将代入,得到 推导过程表明依赖于及x 综合以上过程有: 确定误差限: 记为f(x)在[a,b]上基于等距节点的分段三次Hermite插值函数。在区间[xk,xk+1]上有 而最值 进而得误差估计: 16、求一个次数不高于4次的多项式,使它满足,,。

数值计算方法大作业

目录 第一章非线性方程求根 (3) 1.1迭代法 (3) 1.2牛顿法 (4) 1.3弦截法 (5) 1.4二分法 (6) 第二章插值 (7) 2.1线性插值 (7) 2.2二次插值 (8) 2.3拉格朗日插值 (9) 2.4分段线性插值 (10) 2.5分段二次插值 (11) 第三章数值积分 (13) 3.1复化矩形积分法 (13) 3.2复化梯形积分法 (14) 3.3辛普森积分法 (15) 3.4变步长梯形积分法 (16) 第四章线性方程组数值法 (17) 4.1约当消去法 (17) 4.2高斯消去法 (18) 4.3三角分解法 (20)

4.4雅可比迭代法 (21) 4.5高斯—赛德尔迭代法 (23) 第五章常积分方程数值法 (25) 5.1显示欧拉公式法 (25) 5.2欧拉公式预测校正法 (26) 5.3改进欧拉公式法 (27) 5.4四阶龙格—库塔法 (28)

数值计算方法 第一章非线性方程求根 1.1迭代法 程序代码: Private Sub Command1_Click() x0 = Val(InputBox("请输入初始值x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = (Exp(2 * x0) - x0) / 5 If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求f(x)=e2x-6x=0在x=0.5附近的根(ep=10-10)

1.2牛顿法 程序代码: Private Sub Command1_Click() b = Val(InputBox("请输入被开方数x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = x0 - (x0 ^ 2 - b) / (2 * b) If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求56的值。(ep=10-10)

数值分析大作业

数值分析报大作业 班级:铁道2班 专业:道路与铁道工程 姓名:蔡敦锦 学号:13011260

一、序言 该数值分析大作业是通过C语言程序编程在Microsoft Visual C++ 6.0编程软件上运行实现的。本来是打算用Matlab软间来计算非线性方程的根的。学习Matlab也差不多有一个多月了,感觉自己编程做题应该没什么问题了;但是当自己真心的去编程、运行时才发现有很多错误,花了一天时间修改、调试程序都没能得到自己满意的结果。所以,我选择了自己比较熟悉的C程序语言来编程解决非线性的求值问题,由于本作业是为了比较几种方法求值问题的收敛速度和精度的差异,选择了一个相对常见的非线性函数来反映其差异,程序运行所得结果我个人比较满意。编写C语言,感觉比较上手,程序出现问题也能比较熟练的解决。最终就决定上交一份C程序语言编程的求值程序了!

二、选题 本作业的目的是为了加深对非线性方程求根方法的二分法、简单迭代法、、牛顿迭代法弦截法等的构造过程的理解;能将各种方法的算法描述正确并且能够改编为程序并在计算机上实现程序的正确合理的运行,能得到自己满意的结果,并且能调试修改程序中可能出现的问题和程序功能的增减修改。本次程序是为了比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。 为了达到上面的条件我选择自己比较熟悉的语言—C语言来编程,所选题目为计算方程f(x)=x3-2x-5=0在区间[2,3]内其最后两近似值的差的绝对值小于等于5 ?的根的几种方法的比较。 110- 本文将二分法、牛顿法、简单迭代法、弦截法及加速收敛法这五种方法在同一个程序中以函数调用的方式来实现,比较简洁明了,所得结果能很好的比较,便于分析;发现问题和得出结论。

北航数值分析大作业第一题幂法与反幂法

《数值分析》计算实习题目 第一题: 1. 算法设计方案 (1)1λ,501λ和s λ的值。 1)首先通过幂法求出按模最大的特征值λt1,然后根据λt1进行原点平移求出另一特征值λt2,比较两值大小,数值小的为所求最小特征值λ1,数值大的为是所求最大特征值λ501。 2)使用反幂法求λs ,其中需要解线性方程组。因为A 为带状线性方程组,此处采用LU 分解法解带状方程组。 (2)与140k λλμλ-5011=+k 最接近的特征值λik 。 通过带有原点平移的反幂法求出与数k μ最接近的特征值 λik 。 (3)2cond(A)和det A 。 1)1=n λλ2cond(A),其中1λ和n λ分别是按模最大和最小特征值。 2)利用步骤(1)中分解矩阵A 得出的LU 矩阵,L 为单位下三角阵,U 为上三角阵,其中U 矩阵的主对角线元素之积即为det A 。 由于A 的元素零元素较多,为节省储存量,将A 的元素存为6×501的数组中,程序中采用get_an_element()函数来从小数组中取出A 中的元素。 2.全部源程序 #include #include void init_a();//初始化A double get_an_element(int,int);//取A 中的元素函数 double powermethod(double);//原点平移的幂法 double inversepowermethod(double);//原点平移的反幂法 int presolve(double);//三角LU 分解 int solve(double [],double []);//解方程组 int max(int,int); int min(int,int); double (*u)[502]=new double[502][502];//上三角U 数组 double (*l)[502]=new double[502][502];//单位下三角L 数组 double a[6][502];//矩阵A int main() { int i,k; double lambdat1,lambdat2,lambda1,lambda501,lambdas,mu[40],det;

北航数值分析大作业第二题精解

目标:使用带双步位移的QR 分解法求矩阵10*10[]ij A a =的全部特征值,并对其中的每一个实特征值求相应的特征向量。已知:sin(0.50.2)() 1.5cos( 1.2)(){i j i j ij i j i j a +≠+== (i,j=1,2, (10) 算法: 以上是程序运作的逻辑,其中具体的函数的算法,大部分都是数值分析课本上的逻辑,在这里特别写出矩阵A 的实特征值对应的一个特征向量的求法: ()[]()() []()[]()111111I 00000 i n n n B A I gause i n Q A I u Bu u λλ-?-?-=-?-?? ?-=????→=??????→= ?? ? 选主元的消元 检查知无重特征值 由于=0i A I λ- ,因此在经过选主元的高斯消元以后,i A I λ- 即B 的最后一行必然为零,左上方变 为n-1阶单位矩阵[]()()11I n n -?-,右上方变为n-1阶向量[]()11n Q ?-,然后令n u 1=-,则 ()1,2,,1j j u Q j n ==???-。

这样即求出所有A所有实特征值对应的一个特征向量。 #include #include #include #define N 10 #define E 1.0e-12 #define MAX 10000 //以下是符号函数 double sgn(double a) { double z; if(a>E) z=1; else z=-1; return z; } //以下是矩阵的拟三角分解 void nishangsanjiaodiv(double A[N][N]) { int i,j,k; int m=0; double d,c,h,t; double u[N],p[N],q[N],w[N]; for(i=0;i

北航数值分析报告第三次大作业

数值分析第三次大作业 一、算法的设计方案: (一)、总体方案设计: x y当作已知量代入题目给定的非线性方程组,求(1)解非线性方程组。将给定的(,) i i

得与(,)i i x y 相对应的数组t[i][j],u[i][j]。 (2)分片二次代数插值。通过分片二次代数插值运算,得到与数组t[11][21],u[11][21]]对应的数组z[11][21],得到二元函数z=(,)i i f x y 。 (3)曲面拟合。利用x[i],y[j],z[11][21]建立二维函数表,再根据精度的要求选择适当k 值,并得到曲面拟合的系数矩阵C[r][s]。 (4)观察和(,)i i p x y 的逼近效果。观察逼近效果只需要重复上面(1)和(2)的过程,得到与新的插值节点(,)i i x y 对应的(,)i i f x y ,再与对应的(,)i i p x y 比较即可,这里求解 (,)i i p x y 可以直接使用(3)中的C[r][s]和k 。 (二)具体算法设计: (1)解非线性方程组 牛顿法解方程组()0F x =的解* x ,可采用如下算法: 1)在* x 附近选取(0) x D ∈,给定精度水平0ε>和最大迭代次数M 。 2)对于0,1, k M =执行 ① 计算() ()k F x 和()()k F x '。 ② 求解关于() k x ?的线性方程组 () ()()()()k k k F x x F x '?=- ③ 若() () k k x x ε∞∞ ?≤,则取*()k x x ≈,并停止计算;否则转④。 ④ 计算(1) ()()k k k x x x +=+?。 ⑤ 若k M <,则继续,否则,输出M 次迭代不成功的信息,并停止计算。 (2)分片双二次插值 给定已知数表以及需要插值的节点,进行分片二次插值的算法: 设已知数表中的点为: 00(0,1,,) (0,1,,)i j x x ih i n y y j j m τ=+=???=+=?? ,需要插值的节点为(,)x y 。 1) 根据(,)x y 选择插值节点(,)i j x y : 若12h x x ≤+ 或12 n h x x ->-,插值节点对应取1i =或1i n =-,

上海大学_王培康_数值分析大作业

数值分析大作业(2013年5月) 金洋洋(12721512),机自系 1.下列各数都是经过四舍五入得到的近似值,试分别指出它 们的绝对误差限, 相对误差限和有效数字的位数。 X1 =5.420, x 2 =0.5420, x 3=0.00542, x 4 =6000, x 5=50.610? 解:根据定义:如果*x 的绝对误差限 不超过x 的某个数位的半个单位,则从*x 的首位非零数字到该位都是有效数字。 显然根据四舍五入原则得到的近视值,全部都是有效数字。 因而在这里有:n1=4, n2=4, n3=3, n4=4, n5=1 (n 表示x 有效数字的位数) 对x1:有a1=5, m1=1 (其中a1表示x 的首位非零数字,m1表示x1的整数位数) 所以有绝对误差限 143 11 (1)101022 x ε--≤ ?=? 相对误差限 31() 0.510(1)0.00923%5.4201 r x x x εε-?= == 对x2:有a2=5, m2=0 所以有绝对误差限 044 11 (2)101022 x ε--≤ ?=? 相对误差限 42() 0.510(2)0.00923%0.54202 r x x x εε-?= == 对x3:有a3=5, m3=-2 所以有绝对误差限 235 11 (3)101022 x ε---≤ ?=? 相对误差限 53() 0.510(3)0.0923%0.005423 r x x x εε-?= == 对x4:有a4=0, m4=4 所以有绝对误差限 4411(4)1022 x ε-≤?= 相对误差限 4() 0.5 (4)0.0083%6000 4 r x x x εε= = = 对x5:有a5=6, m5=5 所以有绝对误差限 514 11(5)101022 x ε-≤ ?=? 相对误差限 45() 0.510(5)8.3%600005 r x x x εε?= ==

数值分析第二次大作业

《数值分析》计算实习报告 第二题 院系:机械工程及自动化学院 学号: 姓名: 2017年11月

一、题目要求 试求矩阵A =[a ij ]10×10的全部特征值,并对其中的每一个实特征值求相应的特征向量,已知 a ij ={ sin (0.5i +0.2j ) i ≠j 1.52cos (i +1.2j ) i =j (i,j =1,2, (10) 说明: 1.用带双步位移的QR 方法求矩阵特征值,要求迭代的精度水平为ε=10?12。 2.打印以下内容: (1)全部源程序; (2)矩阵A 经过拟上三角化后所得的矩阵A (n?1); (3)对矩阵A (n?1)实行QR 方法迭代结束后所得的矩阵; (4)矩阵A 的全部特征值λi =(R i ,I i ) (i =1,2,?,10),其中R i =Re(λi ),I i = Im(λi ) 。若λi 是实数,则令I i =0; (5)A 的相应于实特征值的特征向量。 3.采用e 型数输出实型数,并且至少显示12位有效数字。 二、算法设计思路和方案 1. 将矩阵A 拟上三角化得到矩阵A (n?1) 为了减少计算量,一般先利用Householder 矩阵对矩阵A 作相似变换,把A 化为拟上三角矩阵A (n?1),然后用QR 方法计算A (n?1)的全部特征值,而A (n?1)的特征值就是A 的特征值。具体算法如下: 记(1)A A =,()r A 的第r 列至第n 列的元素为(r)(1,2, ,;,1,,)ij a i n j r r n ==+。 对于1,2,,2r n =-执行 (1)若() (2,3,,)r ir a i r r n =++全为零,则令(1)()r r A A +=,转(5);否则转(2)。

北航数值分析大作业第二题

数值分析第二次大作业 史立峰 SY1505327

一、 方案 (1)利用循环结构将sin(0.50.2)() 1.5cos( 1.2)() {i j i j ij i j i j a +≠+==(i,j=1,2,……,10)进行赋值,得到需要变换的 矩阵A ; (2)然后,对矩阵A 利用Householder 矩阵进行相似变换,把A 化为上三角矩阵A (n-1)。 对A 拟上三角化,得到拟上三角矩阵A (n-1),具体算法如下: 记A(1)=A ,并记A(r)的第r 列至第n 列的元素为()n r r j n i a r ij ,,1,;,,2,1) ( +==。 对于2,,2,1-=n r 执行 1. 若 ()n r r i a r ir ,,3,2) ( ++=全为零,则令A(r+1) =A(r),转5;否则转2。 2. 计算 () ∑+== n r i r ir r a d 1 2 )( ()( )r r r r r r r r r r d c a d a c ==-=++则取,0sgn ) (,1)(,1若 )(,12r r r r r r a c c h +-= 3. 令 () n T r nr r r r r r r r r R a a c a u ∈-=++) ()(,2)(,1,,,,0,,0 。 4. 计算 r r T r r h u A p /)(= r r r r h u A q /)(= r r T r r h u p t /= r r r r u t q -=ω T r r T r r r r p u u A A --=+ω)()1( 5. 继续。 (3)使用带双步位移的QR 方法计算矩阵A (n-1)的全部特征值,也是A 的全部特征值,具体算法如下: 1. 给定精度水平0>ε和迭代最大次数L 。 2. 记n n ij n a A A ?-==][) 1()1()1(,令n m k ==,1。

数值分析大作业QR分解

题目:设计求取n n ?实数矩阵A 的所有特征值及其特征向量的数值算法,并以矩阵 20010-1-24A=0-2131 43 1?? ? ? ? ??? 为例进行具体的求解计算。 一、 算法分析: 一般而言,求取实数矩阵所有特征值的方法有雅克比法和QR 分解法,两者都是变换法。其中雅克比法只能求解对称矩阵的全部特征值和特征向量,而QR 则可用于更一般的矩阵特征值的求解,结合反幂法可进而求出各个特征向量。 二、 算法设计: 1、 原始实矩阵A R n n ?∈拟上三角化 为了减少求特征值和特征向量过程中的计算量,对生成的矩阵A 进行拟上三角化,得到拟上三角化矩阵A ’ 记A (1)=A ,并记A (r)的第r 列到第n 列的元素(1,2,...,;,1,...,)r ij a i n j r r n ==+。 对于r=1,2,…,n -2执行 (1) 若() (2,3,...,)r ir a i r r n =++全为零,则令A (r+1)= A (r),转(5);否则转(2)。 (2) 计算 令 ()2 ()() 1,1,1,sgn(0,sgn()=1) r r r r r r r r r r r c a a a ρ+++=-=,(若则取 (3) 令-0=r n r u u ?? ? ?? ,()()()-1,2,1(,,...,)r r r T n r r r r r r nr u a c a a ρ++=- (4) 计算 (r)(r)(r)T n-r r+1,r r r+2,r nr r T n-r T n-r n-r n-r n-r r+1r 1u = (a -c ,a ,...,a )ρ I H =I -2uu =H H =I -2u u A =HA H ?? ? ?? (5) 继续 算法执行完后,就得到与原矩阵A 相似的拟上三角矩阵A (n-1)。 2、 拟上三角矩阵QR 分解的求原矩阵的全部特征值 记A k 是对拟上三角矩阵进行QR 算法,产生的矩阵序列,A 0是起始拟上三角矩阵,

北航数值分析报告大作业第八题

北京航空航天大学 数值分析大作业八 学院名称自动化 专业方向控制工程 学号 学生姓名许阳 教师孙玉泉 日期2014 年11月26 日

一.题目 关于x , y , t , u , v , w 的方程组(A.3) ???? ?? ?=-+++=-+++=-+++=-+++79 .0sin 5.074.3cos 5.007.1cos sin 5.067.2cos 5.0y w v u t x w v u t y w v u t x w v u t (A.3) 以及关于z , t , u 的二维数表(见表A-1)确定了一个二元函数z =f (x , y )。 表A-1 二维数表 t z u 0 0.4 0.8 1.2 1.6 2 0 -0.5 -0.34 0.14 0.94 2.06 3.5 0.2 -0.42 -0.5 -0.26 0.3 1.18 2.38 0.4 -0.18 -0.5 -0.5 -0.18 0.46 1.42 0.6 0.22 -0.34 -0.58 -0.5 -0.1 0.62 0.8 0.78 -0.02 -0.5 -0.66 -0.5 -0.02 1.0 1.5 0.46 -0.26 -0.66 -0.74 -0.5 1. 试用数值方法求出f (x , y ) 在区域}5.15.0,8.00|), {≤≤≤≤=y x y x D (上的近似表达式 ∑∑===k i k j s r rs y x c y x p 00 ),( 要求p (x , y )以最小的k 值达到以下的精度 ∑∑==-≤-=10020 7210)],(),([i j i i i i y x p y x f σ 其中j y i x i i 05.05.0,08.0+==。 2. 计算),(),,(* ***j i j i y x p y x f (i =1,2,…,8 ; j =1,2,…,5) 的值,以观察p (x , y ) 逼 近f (x , y )的效果,其中j y i x j i 2.05.0,1.0**+==。

数值分析大作业 三、四、五、六、七

大作业 三 1. 给定初值0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用 程序. 解:Matlab 程序如下: 函数m 文件:fu.m function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件:dfu.m function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序Newton.m clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:'); flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

while flag1==1 && m<=10^3 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)=ep flag=0; end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +?? =- = ?-???解:Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1; while nerrorlim n=n+1; else break ; end x0=x; end disp(['迭代次数: n=',num2str(n)]) disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)]) (2)子函数 非线性函数f function y=f(x) y=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918); end

北航数值分析第二次大作业--QR分解

《数值分析A》

一、算法设计方案 整个程序主要分为四个函数,主函数,拟上三角化函数,QR分解函数以及使用双步位移求解矩阵特征值、特征向量的函数。因为在最后一个函数中也存在QR分解,所以我没有采用参考书上把矩阵M进行的QR分解与矩阵Ak的迭代合并的方法,而是在该函数中调用了QR分解函数,这样增强了代码的复用性,减少了程序长度;但由于时间关系,对阵中方法的运算速度没有进行深入研究。 1.为了减少QR分解法应用时的迭代次数,首先对给定矩阵进行拟上三角化处理。 2.对经过拟上三角化处理的矩阵进行QR分解。 3.注意到计算特征值与特征向量的过程首先要应用前面两个函数,于是在拟上三角化矩阵的基础上对QR分解函数进行了调用。计算过程中,没有采用goto语句,而是根据流程图采用其他循环方式完成了设计,通过对迭代过程的合并,简化了程序的循环次数,最后在计算特征向量的时候采用了列主元高斯消去法。

二、源程序代码 #include #include #include int i,j,k,l,m; //定义外部变量double d,h,b,c,t,s; double A[10][10],AA[10][10],R[10][10],Q[10][10],RQ[10][10]; double X[10][10],Y[10][10],Qt[10][10],M[10][10]; double U[10],P[10],T[10],W[10],Re[10]={0},Im[10]={0}; double epsilon=1e-12; void main() { void Quasiuppertriangular(double A[][10]); void QRdecomposition(double A[][10]); void DoublestepsQR(double A[][10]); int i,j; for(i=0;i<10;i++) { for(j=0;j<10;j++) { A[i][j]=sin(0.5*(i+1)+0.2*(j+1)); Q[i][j]=0; AA[i][j]=A[i][j]; } A[i][i]=1.5*cos(2.2*(i+1)); AA[i][i]=A[i][i];

北航数值分析课程第一次大作业讲解

《数值分析A》计算实习题目第一题 一.算法设计方案: 1.矩阵A的存储与检索 将带状线性矩阵A[501][501]转存为一个矩阵MatrixC[5][501] . 由于C语言中数组角标都是从0开始的,所以在数组MatrixC[5][501]中检索A的带内元素a ij的方法是: A的带内元素a ij=C中的元素c i-j+2,j 2.求解λ1,λ501,λs ①首先分别使用幂法和反幂法迭代求出矩阵按摸最大和最小的特征值λmax和λmin。λmin即为λs; 如果λmax>0,则λ501=λmax;如果λmax<0,则λ1=λmax。 ②使用带原点平移的幂法(mifa()函数),令平移量p=λmax,求出对应的按摸最大的特征值λ,max, 如果λmax>0,则λ1=λ,max+p;如果λmax<0,则λ501=λ,max+p。 3.求解A的与数μk=λ1+k(λ501-λ1)/40的最接近的特征值λik (k=1,2,…,39)。 使用带原点平移的反幂法,令平移量p=μk,即可求出与μk最接近的特征值λik。 4.求解A的(谱范数)条件数cond(A)2和行列式d etA。 ①cond(A)2=|λ1/λn|,其中λ1和λn分别是矩阵A的模最大和最小特征值。 ②矩阵A的行列式可先对矩阵A进行LU分解后,detA等于U所有

对角线上元素的乘积。 二.源程序(VS2010环境下,C++语言) #include #include #include #include #include #include #include #define E 1.0e-12 /*定义全局变量相对误差限*/ int max2(int a,int b) /*求两个整型数最大值的子程序*/ { if(a>b) return a; else return b; } int min2(int a,int b) /*求两个整型数最小值的子程序*/ { if(a>b) return b; else return a; } int max3(int a,int b,int c) /*求三整型数最大值的子程序*/ { int t; if(a>b) t=a; else t=b; if(t

数值计算大作业

数值计算大作业 题目一、非线性方程求根 1.题目 假设人口随时间和当时人口数目成比例连续增长,在此假设下人口在短期内的增长建立数学模型。 (1)如果令()N t 表示在t 时刻的人口数目,β 表示固定的人口出生率,则人口数目满足微分方程() ()dN t N t dt β=,此方程的解为0()=t N t N e β; (2)如果允许移民移入且速率为恒定的v ,则微分方程变成() ()dN t N t v dt β=+, 此方程的解为 0()=+ (1) t t v N t N e e βββ -; 假设某地区初始有1000000人,在第一年有435000人移入,又假设在第一年年底该地区人口数量1564000人,试通过下面的方程确定人口出生率β,精确到 410-;且通过这个数值来预测第二年年末的人口数,假设移民速度v 保持不变。 435000 1564000=1000000(1) e e βββ + - 2.数学原理 采用牛顿迭代法,牛顿迭代法的数学原理是,对于方程0)(=x f ,如果) (x f 是线性函数,则它的求根是很容易的,牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程0)(=x f 逐步归结为某种线性方程来求解。 设已知方程0)(=x f 有近似根k x (假定0)(≠'x f ),将函数)(x f 在点k x 进行泰勒展开,有 . ))(()()(???+-'+≈k k k x x x f x f x f 于是方程0)(=x f 可近似地表示为 ))(()(=-'+k k x x x f x f 这是个线性方程,记其根为1k x +,则1k x +的计算公式为

数值分析作业答案.doc

第2章 插值法 1、当x=1,-1,2时,f(x)=0,-3,4,求f(x)的二次插值多项式。 (1)用单项式基底。 (2)用Lagrange 插值基底。 (3)用Newton 基底。 证明三种方法得到的多项式是相同的。 解:(1)用单项式基底 设多项式为:2 210)(x a x a a x P ++=, 所以:64 211111 1111122 2 211 200 -=-==x x x x x x A 3 76144 211111114241 13110111)() ()(22 221120 022 2 22 11 120 00-=-= ---==x x x x x x x x x f x x x f x x x f a 2 3694211111114411 31101111)(1)(1 )(122 221120 02 2 22112 001=--= --==x x x x x x x x f x x f x x f a 6 5654 2 1 1111114 2 1 3 11011111) (1)(1)(122 2 21120 022 11 00 2=--= ---==x x x x x x x f x x f x x f x a 所以f(x)的二次插值多项式为:26 52337)(x x x P ++-= (2)用Lagrange 插值基底 )21)(11() 2)(1())(())(()(2010210-+-+=----=x x x x x x x x x x x l )21)(11() 2)(1())(())(()(2101201------=----=x x x x x x x x x x x l ) 12)(12() 1)(1())(())(()(1202102+-+-=----= x x x x x x x x x x x l

北航数值分析大作业3

一、算法设计方案 1.使用牛顿迭代法,对原题中给出的i x i 08.0=,j y j 05.05.0+=, (010 ,020i j ≤≤≤≤)的11*21组j i y x ,分别求出原题中方程组的一组解,于是得到一组和i i y x ,对应的j i t u ,。 2.对于已求出的j i t u ,,使用分片二次代数插值法对原题中关于u t z ,,的数表进行插值得到 ij z 。于是产生了z=f(x,y)的11*21个数值解。 3.从k=1开始逐渐增大k 的值,并使用最小二乘法曲面拟合法对z=f(x,y)进行拟合,得到每次的σ,k 。当7 10-<σ时结束计算,输出拟合结果。 4.计算)5,,2,1,8,,2,1)(,(),,(* ***???=???=j i y x p y x f j i j i 的值并输出结果,以观察),(y x p 逼近),(y x f 的效果。其中j y i x j i 2.05.0,1.0* *+==。 二、算法实现方案 1、求(,)f x y : (1)Newton 法解非线性方程组 0.5cos 2.670.5sin 1.07(1)0.5cos 3.740.5sin 0.79 t u v w x t u v w y t u v w x t u v w y +++-=??+++-=? ? +++-=??+++-=?, 其中,t, u, v ,w 为待求的未知量,x, y 为代入的已知量。 设(,,,)T t u v w ξ=,给定精度水平12110ε-=和最大迭代次数M ,则解该线性方程组的迭代格式为: *(0)(0)(0)(0)(0)(k+1) ()()1()(,,,)()()0,1,T k k k t u v w F F k ξξξ ξξξ-?=?'=-??= ? 在附近选取初值, 迭代终止条件为()(1) () 1/k k k ξξ ξε-∞ ∞ -≤,若k M >时仍未达到迭代精度,则迭代计算失 败。 其中,雅可比矩阵 0.5*cos(t) + u + v + w - x - 2.67t + 0.5*sin(u) + v + w - y - 1.07()0.5*t + u + cos(v) + w - x - 3.74t + 0.5*u + v + sin(w) - y - 0.79F ξ???? ? ?=?????? ,

相关主题
文本预览
相关文档 最新文档