没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
《数值分析 B》计算实习第三题
算法的设计方案
1. 使 用 牛顿迭代 法 ( 简 单迭 代 法 不 收 敛 ) , 对 原 题 中 给 出 的 ,
,( )的 11*21 组 分别求出原题中方程
组的一组解,于是得到一组和 对应的 。
2.对于已求出的 ,使用分片二次代数插值法对原题中关于 的数表进
行插值得到 。于是产生了 z=f(x,y)的 11*21 个数值解。
3.从 k=1 开始逐渐增大 k 的值,并使用最小二乘法曲面拟合法对 z=f(x,y)进
行拟合,得到每次的 。当 时结束计算,输出拟合结果。
4.计算 的值并输出结果,以观察
逼近 的效果。其中 。
源程序代码
#include<stdio.h>
#include<math.h>
#define N 4
double e=1e-12;
double gauss(double a[N][N+1],double x[N]) //gauss 求线性方程组
{
int i,j,k;
double p=0;
for(k=0;k<N-1;k++)
{
if(a[k][k]==0)
{
printf("a[%d][%d]=0\n",k,k);
return 1;
}
for(i=k+1;i<N;i++)
{
p=a[i][k]/a[k][k];
for(j=k;j<N+1;j++)
a[i][j]=a[i][j]-p*a[k][j];
}
}
if(a[N-1][N-1]==0)
{
printf("a[%d][%d]=0\n",N-1,N-1);
return 1;
}
x[N-1]=a[N-1][N]/a[N-1][N-1];
for(i=N-2;i>=0;i--)
{
p=0;
for(j=N-1;j>i;j--)
{
p=p+a[i][j]*x[j];
}
x[i]=(a[i][N]-p)/a[i][i];
}
return 0;
}
void A_ni(double A[10][10],int n) //求逆矩阵
{
double a[10][10],b[10][20],c[10][10],t;
int i,j,m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
b[i][j]=A[i][j];
for(i=0;i<n;i++)
for(j=n;j<2*n;j++)
b[i][j]=0;
for(i=0;i<n;i++)
b[i][n+i]=1;
for(m=0;m<n;m++)
{
t=b[m][m];
i=m;
while(b[m][m]==0)
{
b[m][m]=b[i+1][m];
i++;
}
if(i>m)
{
b[i][m]=t;
for(j=0;j<m;j++)
{
t=b[m][j];
b[m][j]=b[i][j];
b[i][j]=t;
}
for(j=m+1;j<2*n;j++)
{
t=b[m][j];
b[m][j]=b[i][j];
b[i][j]=t;
}
}
for(i=m+1;i<n;i++)
for(j=2*n-1;j>=m;j--)
b[i][j]-=b[i][m]*b[m][j]/b[m][m];
for(j=2*n-1;j>=m;j--)
b[m][j]/=b[m][m];
}
m=n-1;
while(m>0)
{
for(i=0;i<m;i++)
for(j=2*n-1;j>=m;j--)
b[i][j]-=b[i][m]*b[m][j];
m--;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c[i][j]=b[i][n+j];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
A[i][j]=c[i][j];
}
}
}
void Newton(double x,double y,double tu[4]) //Newton 迭代法解非线性方程组
{
int i,j;
double A[4][5],result[4]={1,2,1,2},result1[4];
double num1,num2;
while(1)
{
for(i=0;i<4;i++)
result1[i]=result[i];
A[0][0]=-0.5*sin(result[0]);
A[0][1]=1;
A[0][2]=1;
A[0][3]=1;
A[1][0]=1;
A[1][1]=0.5*cos(result[1]);
A[1][2]=1;
A[1][3]=1;
A[2][0]=0.5;
A[2][1]=1;
A[2][2]=-1*sin(result[2]);
A[2][3]=1;
A[3][0]=1;
A[3][1]=0.5;
A[3][2]=1;
A[3][3]=cos(result[3]);
A[0][4]=-1*(0.5*cos(result[0])+result[1]+result[2]+result[3]-x-2.67);
A[1][4]=-1*(result[0]+0.5*sin(result[1])+result[2]+result[3]-y-1.07);
A[2][4]=-1*(0.5*result[0]+result[1]+cos(result[2])+result[3]-x-3.74);
A[3][4]=-1*(result[0]+0.5*result[1]+result[2]+sin(result[3])-y-0.79);
gauss(A,result);
num1=num2=0;
for(i=0;i<4;i++)
{
num1+=result[i]*result[i];
num2+=result1[i]*result1[i];
}
num1=sqrt(num1);
剩余15页未读,继续阅读
资源评论
everybreathyoutake
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功