《数值分析》
课 程 实 验 报 告
【实验内容与要求】
每个月存250元,并持续20年,希望在20年后本金和利息的总值达到250000元。年利率x为多少时可以满足需求?
【算法说明】
1. 将方程简化,然后用二分法逼近方程的根,从而求解。
2. 二分法求解思想
方程 f(x)=0在区域【a,b】内求解
A. 计算端点的值f(a),f(b);
B. 计算f(x)在区间中点(a+b)/2处的值,即的值;
C. 若则(a+b)/2就是方程的根,计算过程结束,否则继续检验:
若,则以(a+b)/2代替b,否则以(a+b)/2代替a.
反复执行步骤B,C直到区间【a,b】的长度小于允许误差ε,此时中点(a+b)/2即为所有近似根。
【源程序】
程序1(ps:二分法)
#include <math.h>
#include <stdio.h>
//float p;
//int n;
int m=250000;
void main()
{
float x,x1=0,x2=1;
float p;
int n;
float F(float x,float x1,float x2);
printf("请输入每个月存入的金额p和存款年份n的值:\n");
scanf("%f%d",&p,&n);
printf("x=%f\n",F(x,x1,x2));
}
float F(float x,float x1,float x2)
{
float f,f1,f2;
float p;
int n;
do
{
f1=(p*12/x1)*(pow((1+x1/12),n*12)-1)-m;
f2=(p*12/x2)*(pow((1+x2/12),n*12)-1)-m;
}while(f1*f2>0); //确保输入的x1,x2使得f1,f2符号相反
do
{
x=(x1+x2)/2; //求x1,x2的中点
f=(p*12/x)*(pow((1+x/12),n*12)-1)-m;
if(f1*f>0) //当f与f1符号相同时
{
x1=x;f1=f;
}
else if(f2*f>0) //当f与f2符号相同时
{
x2=x;f2=f;
}
}while(fabs(f)>1e-6); //判断条件fabs(f)>1e-6的意思是f的值趋于0
return x;
}
程序2(ps:程序二是根据题意及结果分析直接写的代码,并没有用二分法)
#include<iostream>
#include <math.h>
using namespace std;
double sum=250;//sum表示总的本息和
double fun(double x){//计算本息和
double sum1=250;//sum1表示每个月的本息和
for(int i=0;i<240;i++){//20年,共240个月
sum1*=(1+x/12);
sum+=sum1;
}
return sum;
}
void main(){
double x=0.0035;//0.0035是我网上搜的最小的利率
do{
fun(x);
x+=0.0001;//利率增加的单位大小为0.0001
}while(sum<250000);//当本息和小于250000时,一直执行程序
cout<<"所求的最小年利率为:"<<x<<endl;
}
【实验结果】
程序一得出的答案,但是可能是方程有问题,故答案有问题,即得到利率为0
程序二得出的结果年利率为x=0.004
【实验结果分析与说明】
设每个月存钱p,且年利率为x,存了N次后,钱的总数为
P为最近年的钱数
第一年的本金和利息
第二年的本金和利息
…………
第N年的本金和利息
求N项级数和的公式为:
故
利用二分法 对方程求解。
第二篇:数值分析实验报告一
《数值分析》实验报告一
——海底测量问题(插值法的应用)
姓名:徐元君 学号:200820402024 学院:物理电子学院
一、实验问题
下表中给出了水面直角坐标处水深,这是在低潮时候测得的。如果船的吃水深度为,求:在矩形域,中行船应避免进入哪些区域?
二、问题分析
从表中可以看出,这是一批不规则数据。由于没有先验函数,因此我们使用插值法(即在生产实验和科学研究中,由实验和测量得到了变量间的一批离散样点,要求得到变量之间的函数关系或得到样点之外的数据值,与此有关的一类问题即为插值问题)。为了使结果更为直观,考虑将的数据转化为相对于海面的高度。具体分析为:
1、显示测量点在水平面的具体位置;
2、通过Matlab的griddata命令对杂乱的数据进行插值,显示海底的地形图,找出存在暗礁的大概区域;
3、进一步显示水深不到5米的区域,即为避免船进入的危险区;
三、程序设计
clear;
close;
%显示测量点的位置
figure(1);
x=[129 140 108 88 185 195 105 157 107 77 145 162 162 117];
y=[7 141 28 147 22 137 85 -6 -81 3 45 -66 84 -138];
plot(x,y,'*');%绘制二维曲线图
title('测量点的位置');
%显示所考虑区域内的海底地形图
figure(2);
z=[4 8 6 8 6 8 8 9 9 8 8 9 4 9];
h=-z;
xi=75:5:200;
yi=[-50:10:150]';
HI=griddata(x,y,h,xi,yi,'cubic');%杂乱数据插值
mesh(xi,yi,HI);%绘制网线图
view(-60,30);%视角转换
title('海底地形图');
%显示水深不到5米的区域
figure(3);
contour(xi,yi,HI,[-5,-5],'b');%绘制二维等高线图
title('水深不到5米的区域');
四、实验结果
通过Matlab的程序运行结果分别如下:
图1.测量点的位置
图2.海底地形图
图3.危险区域
五、实验结论
由图1中我们清晰的看到了测量点的位置;在图2中我们通过海底地形图清晰的看见在坐标(129,7.5)和(162,84)附近各有一块暗礁;通过图3我们进一步看到了水深不到5m的两个区域,即为所求的避免船只进入的两个危险区。