数值分析第3次上机作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数值分析》

第3次上机作业

姓名:

学号:

2015.12.9

1 算法设计思路和方案

1.1 总体方案设计

(1)解非线性方程组。将给定的(,)i i x y 当作已知量代入题目给定的非线性方程组,求得与(,)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.2 具体算法设计:

1.2.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 次迭代不成功的信息,并停止计算。

1.2.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 =-, 若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 的对应关系。 1.2.3 曲面拟合

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

010*********

()()()()()()()()()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 。

2 源程序代码

#include

#include

#include

#define n 4

static double x[n],x_[n],t[11][21],u[11][21],U[11][21],tt[8][5],uu[8][5],UU[8][5],c[9][9]; int k;

//求数组中的最大值

double MAX(double a[n])

{

int i;

double max;

max=fabs(a[0]);

for(i=0;i

if(fabs(a[i])>max)

max=fabs(a[i]);

return(max);

}

//选主元的DooLittle 分解法求线性方程组

void DooLittle(double a[n][n],double b[n])

{

int i,j,k,t,i_k,m[n];

double u[n][n],l[n][n],s[n],y[n];

double u_x,l_u,max,temp;

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

{

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

{

l_u=0;

for(t=1;t<=k-1;t++)

l_u=l_u+l[i-1][t-1]*u[t-1][k-1];

s[i-1]=a[i-1][k-1]-l_u;

}

max=fabs(s[k-1]);

i_k=k;

m[k-1]=k;

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

if(fabs(s[i-1])>max)

{

max=fabs(s[i-1]);

i_k=i;

m[k-1]=i_k;

}

相关文档
最新文档