• dragon_
    了解作者
  • C/C++
    开发工具
  • 11KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 76
    下载次数
  • 2010-04-16 20:24
    上传日期
北航数值分析大作业第三题:牛顿迭代法求z=f(x,y)
Work3.rar
  • 计算实习第三次大作业.CPP
    15.5KB
  • 计算实习第三次大作业.exe
    25.2KB
内容介绍
/******************************************************************************* * * 计算实习大作业第三题源程序 * 作者: 理学院系统与控制科学系 35093120 吴豪 * 本程序在 Dev-C++ 4.9.9.0 版本下调试通过 * 最后修改:2008.03.28 * *******************************************************************************/ #define N 6 //矩阵的阶; #define M 4 //方程组未知数个数; #define EPSL 1.0e-12 //迭代的精度水平; #define MAXDIGIT 1.0e-219 #define SIGSUM 1.0e-7 #define L 500 //迭代最大次数; #define K 10 //最小二乘法拟合时的次数上限; #define X_NUM 11 #define Y_NUM 21 #define OUTPUTMODE 1 //输出格式:0--输出至屏幕,1--输出至文件 #include <stdio.h> #include <math.h> double mat_u[N] = {0, 0.4, 0.8, 1.2, 1.6, 2.0}, mat_t[N] = {0, 0.2, 0.4, 0.6, 0.8, 1.0}, mat_ztu[N][N] = { {-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}, }, mat_val_z[X_NUM][Y_NUM] = {0}, init_tuvw[4] = {1,2,1,2}, mat_crs[K][K] = {0}; FILE *p; int main() { int i, j, x, y, kmin, tmp = 0; double tmpval; int getval_z(double, double, int, int); int leasquare(); void result_out(int); if(OUTPUTMODE) { p = fopen("c:\\Result.txt", "w+"); fprintf(p, "计算结果:\n"); fclose(p); } for(i = 0; i < X_NUM; i++) for(j = 0; j < Y_NUM; j++) tmp+= getval_z(0.08 * i,0.5 + 0.05 * j, i, j); if(!tmp) printf("迭代求解 z=f(x,y) 完毕。\n"); else printf("迭代超过最大次数,计算结果可能不准确!\n"); if(kmin=leasquare()) { printf("近似表达式已求出!\n"); for(i = 0; i < 8; i++) for(j = 0; j < 5; j++) tmp+= getval_z(0.1 * (i+1),0.5 + 0.2 * (j+1), i, j); if(!tmp) { printf("迭代求解 z=f(x*,y*) 完毕。\n"); for(x = 0; x < 8; x++) { for(y = 0; y < 5; y++) { tmpval = 0; for(i = 0; i < kmin; i++) { for(j = 0; j < kmin; j++) { tmpval= tmpval + mat_crs[i][j] * pow(0.1 * (x+1), i) * pow(0.5 + 0.2 * (y+1), j); } } if(OUTPUTMODE) { p = fopen("c:\\Result.txt", "at+"); fprintf(p, "x*[%d]=%f, y*[%d]=%f: f(x*[%d], y*[%d])=%.12le, p(x*[%d], y*[%d])=%.12le\n", x+1, 0.1 * (x+1), y+1, 0.5 + 0.2 * (y+1), x+1, y+1, mat_val_z[x][y], x+1, y+1, tmpval); fclose(p); } else printf("x[%d]=%f, y[%d]=%f: f(x*[%d], y*[%d])=%.12le, p(x*[%d], y*[%d])=%.12le\n", x+1, 0.1 * (x+1), y+1, 0.5 + 0.2 * (y+1), x+1, y+1, mat_val_z[x][y], x+1, y+1, tmpval); } } } printf("结果见C:\\Result.txt!"); getchar(); } else { printf("近似表达式未求出,请增大K值后重试!\n"); getchar(); } } int getval_z(double x, double y, int i, int j) { double vec_tuvw[M], vec_delta[M], fdao[M][M], f[M], mo_k, mo_delta_k, shang, t, u; int n = 0, k, flag_max, flag_stat; void solve(double fdao[M][M], double vec_delta[M], double f[M]); double interpolation(double, double); flag_stat = 1; for(k = 0; k < M; k++) vec_tuvw[k] = init_tuvw[k]; do { f[0] = -1.0 *(0.5 * cos(vec_tuvw[0]) + vec_tuvw[1] + vec_tuvw[2] + vec_tuvw[3] - x - 2.67); f[1] = -1.0 *(vec_tuvw[0] + 0.5 * sin(vec_tuvw[1]) + vec_tuvw[2] + vec_tuvw[3] - y - 1.07); f[2] = -1.0 *(0.5 * vec_tuvw[0] + vec_tuvw[1] + cos(vec_tuvw[2]) + vec_tuvw[3] - x - 3.74); f[3] = -1.0 *(vec_tuvw[0] + 0.5 * vec_tuvw[1] + vec_tuvw[2] + sin(vec_tuvw[3]) - y - 0.79); fdao[0][0] = -0.5 * sin(vec_tuvw[0]); fdao[0][1] = 1; fdao[0][2] = 1; fdao[0][3] = 1; fdao[1][0] = 1; fdao[1][1] = 0.5 * cos(vec_tuvw[1]); fdao[1][2] = 1; fdao[1][3] = 1; fdao[2][0] = 0.5; fdao[2][1] = 1; fdao[2][2] = -1 * sin(vec_tuvw[2]); fdao[2][3] = 1; fdao[3][0] = 1; fdao[3][1] = 0.5; fdao[3][2] = 1; fdao[3][3] = cos(vec_tuvw[3]); solve(fdao, vec_delta, f); flag_max = 0; for(k = 1; k < M; k++) if(fabs(vec_delta[k]) > fabs(vec_delta[flag_max])) flag_max = k; mo_delta_k = vec_delta[flag_max]; flag_max = 0; for(k = 1; k < M; k++) if(fabs(vec_tuvw[k]) > fabs(vec_tuvw[flag_max])) flag_max = k; mo_k = vec_tuvw[flag_max]; shang = fabs(mo_delta_k / mo_k); if(shang < EPSL) { t = vec_tuvw[0] + vec_delta[0], u = vec_tuvw[1] + vec_delta[1]; flag_stat = 0; break; } else for(k = 0; k < M; k++) vec_tuvw[k]+= vec_delta[k]; } while(n++ <= L); if(!flag_stat) { if(OUTPUTMODE) { p = fopen("c:\\Result.txt", "at+"); fprintf(p, "x%d=%f, y%d=%f: f(x%d, y%d)=%.12le\n", i, 0.08*i, j, 0.5+0.05*j, i, j, mat_val_z[i][j] = interpolation(u,t)); fclose(p); } else printf("x%d=%f, y%d=%f: f(x%d, y%d)=%.12le\n", i, 0.08*i, j, 0.5+0.05*j, i, j, mat_val_z[i][j] = interpolation(u,t)); } return flag_stat; } void solve(double fdao[M][M], double vec_delta[M], double f[M]) { int i, j, k, ik; double tmp, mik; for(k = 0; k < M-1; k++) { ik = k; for(i = k; i < M; i++) if(fabs(fdao[ik][k]) < fabs(fdao[i][k])) ik = i; for(j = k; j < M; j++) { tmp = fdao[k][j]; fdao[k][j] = fdao[ik][j]; fdao[ik][j] = tmp; } tmp = f[k]; f[k] = f[ik]; f[ik] = tmp; for(i = k + 1; i < M; i++) { mik = fdao[i][k] / fdao[k][k]; for(j = k; j < M; j++) fdao[i][j] = fdao[i][j] - mik * fdao[k][j]; f[i]-= mik * f[k]; } } vec_delta[M-1] = f[M-1] / fdao[M-1][M-1]; for(k = M-2; k >= 0; k--) { tmp = 0; for(j = k+1; j < M; j++) tmp+= fdao[k][j] * vec_delta[j]; vec_delta[k] = (f[k] - tmp) / fdao[k][k]; } } double interpolation(double u, double t) { int r, i, j, k; double coe_u[3], coe_t[3], z; z = 0; r = int(fabs((t / 0.2) + 0.5)); k = int(fabs((u / 0.4) + 0.5)); if(r = 0) r = 1; if(r = 5) r = 4; if(k = 0) k = 1; if(k = 5) k = 4; coe_u[0] = (u - mat_u[k])*(u - mat_u[k + 1]) / (mat_u[k - 1]- mat_u[k]) / (mat_u[k - 1]- mat_u[k + 1]); coe_u[1] = (u - mat_u[k - 1])*(u -
评论
    相关推荐
    • 北航数值分析课程课件.zip
      资源涉及了数值分析的详细课件 目录: 1.误差分析 2.向量范数和矩阵范数 3.高斯消去法 4.经典迭代法 5.三角分解法 6.共轭梯度法 7.病态线性方程组的解法 8.幂法和反幂法 9.Jacobi方法 10.QR方法
    • 北航数值分析大作业一
      数值分析大作业,球特征值的。并求出特征向量。C++编程。
    • 北航数值分析作业第一题
      北航数值分析作业第一题 用幂法、反幂法求一个501*501的矩阵的最小特征值、最大特征值、按模最大特征值以及条件数和行列式
    • 北航 数值分析 高斯算法
      北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析
    • 北航数值分析作业第一题工程源码
      北航数值分析作业第一题工程源码 用幂法、反幂法求一个501*501的矩阵的最小特征值、最大特征值、按模最大特征值以及条件数和行列式. 在VC6.0上编译通过
    • 北航数值分析作业第二题
      北航数值分析作业第二题 用带双步位移的QR分解法求矩阵的全部特征值,并对其中的每个特征值求特征向量。
    • 北航 数值分析 Doolittle分解
      小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~小程序~
    • 北航数值分析 作业 代码
      北航数值分析 作业 代码 C++ 最后代码提交
    • 北航数值分析大作业
      北京航空航天大学研究生数值分析三个大作业,吕老师,有详细的算法设计说明 执行结构 源代码 所有程序均各人编写经过调试,所得结果正确。2010年最新
    • 北航 数值分析 矩阵的拟上三角化
      北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析北航 数值分析