工数上机编程解题.docx
《工数上机编程解题.docx》由会员分享,可在线阅读,更多相关《工数上机编程解题.docx(14页珍藏版)》请在冰豆网上搜索。
工数上机编程解题
工科数学分析基础
上机实验报告
班级:
学号:
姓名:
一、微分方程
1.1题目:
在一条宽为20米的道路两旁,分别安装了一只2kw和一只3kw的路灯,它们里地面的高度肺部为5m和6m。
在漆黑的夜晚,当两只路灯同时开启的时候,
求:
(1)两只路灯连线的路面上最暗的点和最亮的点分别在哪里?
(2)如果3kw的路灯高度可以在3m到9m之间变化,如何使路面上最暗点的亮度最大?
1.2算法:
利用迭代法来解微分方程
1.2.1第一小问N—S流程图:
1.2.2第二小问N—S流程图:
1.3程序:
1.3.1第一问:
#include
intmain()
{
doublef(doublex);
doubleb1,b2,a1=0,a2=0,i;
b1=f(0);
b2=f(0);
for(i=0;i<=20;i=i+0.0001)
{
if(b1>f(i))
{
b1=f(i);
a1=i;
}
}
for(i=0;i<=20;i=i+0.0001)
{
if(b2{
b2=f(i);
a2=i;
}
}
printf("两只路灯连线的路面上最暗点是%lf最亮点是%lf\n",a1,a2);
return0;
}
doublef(doublex)
{
doublez;
z=2/(25+x*x)+3/((20-x)*(20-x)+36);
return(z);
}
1.3.2第二问:
#include
intmain()
{
doubleg(doublex,doubley);
doublemin1,min2,i,j,h1=3,q;
min1=g(0,3);
min2=g(0,3);
for(i=3.0;i<=9;i=i+0.01)
{
for(j=0.0;j<=20;j=j+0.01)/*求出给定H的最暗点的亮度*/
{
q=g(j,i);
if(min2>q)
min2=q;
}
if(min1{
min1=min2;
h1=i;
}
}
printf("当3w的路灯高为%lf时可以使路灯之间最暗的点亮度最大\n",h1);
return0;
}
doubleg(doublex,doubley)
{
doublez;
z=2.0/(25.0+x*x)+3.0/((20.0-x)*(20.0-x)+y*y);
return(z);
}
1.4运行结果:
1.4.1第一问:
两只路灯连线的路面上
最暗点距离第一个路灯9.430100米最亮点距离第一个路灯19.903000米
1.4.2第二问:
第二个路灯最佳高度为3.000米
1.5分析:
1.5.1第一问:
路灯是点光源s,空间内任何一点m的亮度与s、m两点之间的距离的平方成反比。
设:
x为路面上的点与5m路灯之间的水平距离
单位:
m
路灯S2
把Q(i)的值作为亮度指标,比较两个点Q(i)的大小。
当x从0到20过程中,通过不断的比较,程序自动筛选出Q(i)最小的点
与Q(i)最大的点
。
图1—1
是亮度最小的点,
是亮度最大的点。
1.5.2第二问:
路灯S2
单位:
m
路灯S2的h在变,对于每个
,在路面上
都对应一个最暗的点
,以及该点的亮度
指标
。
在从3变到9的过程中,把最大的
找出来,
图1—2
此时对应的
就是所求的高度。
二、牛顿法求方程近似根
2.1题目:
利用切线法求方程的近似解
2.2算法:
运用牛顿算法
用N—S流程图
2.3程序:
#include
#include
#include
intmain()
{
doubleaver(doublex);
doublevalue(doubley);
doublea,b=0;
scanf("%lf",&a);
do
{
a=a-b/value(a);
b=aver(a);
}
while(fabs(b)>1e-6);
printf("该方程的解是%lf\n",a);
return0;
}
doubleaver(doublex)
{
doublesum=0;
sum=x*x*x-2*x-5;
return(sum);
}
doublevalue(doubley)
{
doubleval=0;
val=3*y*y-2;
return(val);
}
2.4运行结果:
x=2.094551
2.5分析:
1.设置函数
使得
2.任取一个数x,代入函数
,比较
与0的大小,若
与0偏差较大,取点
曲线上(x,
)点的切线与x轴交点横坐标x’
3.把x’代入
重复步骤2直到
无限趋近于0为止
三、最小二乘法
3.1题目:
通过实验,测得x,y的一组数据
X
Y
0.5
0.0001
1.5
1.9998
2.5
4.0010
3.5
5.9980
4.5
8.0001
5.5
10.00010
由经验可知x与y是线性关系,试用最小二乘法求y的表达式。
3.2算法:
运用最小二乘法
N—S流程图表示算法
3.3程序:
#include
intmain()
{
doublequadsum(doublea[6]);
doublealgesum(doublea[6]);
doublepsum(doublea[6],doubleb[6]);
doubleempfor1(doublea[6],doubleb[6]);
doubleempfor2(doublea[6],doubleb[6]);
doublem,n;
doublea[6]={0.5,1.5,2.5,3.5,4.5,5.5};
doubleb[6]={0.0001,1.9998,4.0010,5.9980,8.001,10.00010};
m=empfor1(a,b);
n=empfor2(a,b);
printf("y=%lf*x+(%lf)\n",m,n);
return0;
}
doublequadsum(doublea[6])/*平方和函数*/
{
doublesum=0;
inti;
for(i=0;i<6;i++)
sum=sum+a[i]*a[i];
return(sum);
}
doublealgesum(doublea[6])/*代数和函数*/
{
doublesum=0;
inti;
for(i=0;i<6;i++)
sum=sum+a[i];
return(sum);
}
doublepsum(doublea[6],doubleb[6])/*乘积和函数*/
{
doubleQ=0;
inti;
for(i=0;i<6;i++)
Q=Q+a[i]*b[i];
return(Q);
}
doubleempfor1(doublea[6],doubleb[6])/*经验公式1*/
{
doublem,x,y1,y2,z;
x=quadsum(a);/*a的平方和*/
y1=algesum(a);/*a的代数和*/
y2=algesum(b);/*b的代数和*/
z=psum(a,b);/*a与b的乘积和*/
m=(6*z-y1*y2)/(6*x-y1*y1);
return(m);
}
doubleempfor2(doublea[6],doubleb[6])/*经验公式2*/
{
doublen,x,y1,y2,z;
x=quadsum(a);/*a的平方和*/
y1=algesum(a);/*a的代数和*/
y2=algesum(b);/*b的代数和*/
z=psum(a,b);/*a与b的乘积和*/
n=(z*y1-x*y2)/(y1*y1-6*x);
return(n);
}
3.4运行结果:
3.5分析:
题目已经给出x与y是线性关系,于是可以直接求与测量值的偏差平方之和
设x与y之间的函数关系是y=ax+b,其中常数a,b待定。
由最小二乘法知道,问题变为求二元函数
的最小值。
利用多元函数极值的必要条件,得
整理化简,得
最终解得方程的
的唯一驻点a=2.000057,b=-1.000051
所求y的方程为