c语言程序设计,数模02 matlab程序&C语言

第一问:
function zhixiaozhi=myfun(n,x,y)
for k=1:y
for j=1:x
for i=1:n
p=normcdf(k,600,196.6291695);
temp(i,j,k)=p*(10*i+3000+100*(j+1)*(j+2)/j)/i/j+(1-p)*(10*i+1000+200*(k-i*j))/k;
if k<i*j
temp(i,j,k)=20;
end
end
end
end
value=min(min(min(temp)));
[r c v]=find(temp==value);
o=find(temp==value);
r=mod(mod(o,n*x),x)
c=ceil(mod(o,n*x)/n)
y=ceil(o/n/x)
生成三维矩阵搜索最值,但三重循环使算法运行速度太慢,应该可用矩阵相乘实现多重循环,但在矩阵相乘中维数的问题还有待考虑。
其次关于find的函数的用法,在matlab中find函数可以返回一二维矩阵的坐标值,
[r c v]其中v是逻辑值(一种情况),目前不知道返回三维坐标的函数,
根据find函数的特点,找出所求值在矩阵中的index,再化为三维坐标值
E.G.
value=min(min(min(temp)));
o=find(temp==value);
r=mod(mod(o,n*x),x)
c=ceil(mod(o,n*x)/n)
y=ceil(o/n/x)
第二问:
C程序:
#include"stdio.h"
#include"math.h"
#define D 1000
#define Pi 3.1415926
double integrate(double lower_x,double upper_x) //积分函数
{
int i;
double delta =(upper_x-lower_x)/D;
double s=0;
double x=lower_x;
for(i=0; i<D;++i, x+=delta)
s+=exp((-(x-600)*(x-600))/(2*196.6291695*196.6291695))/(sqrt(2*Pi)*196.6291695);
return s*delta;
}
void main()
{
int n,m,x,i,z=0,b[15000],c[15000];
double N,w,a[15000],min,P1,P2,num1,num2,M1,M2;
//下面对m进行穷举
for(x=400;x<=700;x++)//由正态分布确定x范围
{
for(m=5;m<=30;m++)
{
M2=0;
num2=0;
P1=1-integrate(0,x);//未出故障更换刀具的概率
n=x/m+1;//次数
for(i=2;i<n;i++)
{
P2=integrate(m*(i-1),m*i);//出故障更换刀具的概率
num2+=((10*i+3000+200*(0.6*m+(i-1)*m*0.02))*0.6*P2+(10*x/m+1000+1500+0.02*x*200)*0.4*P2);
M2+=x*0.98*0.4*P2+((i-1)*m*0.98+m*0.4)*0.60*P2;
}
num1=(10*i+3000+1500+200*(0.60*m+(i-1)*m*0.02))*0.02*P1+(10*x/m+1000+0.02*x*200)*0.98*P1;
M1=x*0.98*0.98*P1+((i-1)*m*0.98+m*0.4)*0.02*P1;
N=M1+M2;//生产过程中合格零件数量的期望
w=(num1+num2)*1.0/N;//平均损失费用
b[z]=x;
c[z]=m;
a[z++]=w;
}
}
min=a[0];
for(i=1;i<z;i++)//做排序输出最小损失费用
{
if(a<min)
{
min=a;x=b;m=c;
}
}
printf("最小损失为:%f,此时x值为:%d,m值为:%d,num2的值%f\n",min,x,m,num2);
}
第二问matlab程序:
tic
z=1;
for x=400:700
for m=5:30
M2=0;num2=0;
P1=1-normcdf(x,600,196.6291695);%&Icirc;&acute;&sup3;&ouml;&sup1;&Ecirc;&Otilde;&Iuml;&cedil;ü&raquo;&raquo;&micro;&para;&frac34;&szlig;&micro;&Auml;&cedil;&Aring;&Acirc;&Ecirc;
n=ceil(x/m);
for i=2:n P2=normcdf(m*i,600,196.6291695)-normcdf(m*(i-1),600,196.6291695);%&sup3;&ouml;&sup1;&Ecirc;&Otilde;&Iuml;&cedil;ü&raquo;&raquo;&micro;&para;&frac34;&szlig;&micro;&Auml;&cedil;&Aring;&Acirc;&Ecirc; num2=num2+((10*i+3000+200*(0.6*m+(i-1)*m*0.02))*0.6*P2+(10*x/m+1000+1500+0.02*x*200)*0.4*P2);
M2=M2+x*0.98*0.4*P2+((i-1)*m*0.98+m*0.4)*0.60*P2;
end num1=(10*i+3000+1500+200*(0.60*m+(i-1)*m*0.02))*0.02*P1+(10*floor(x/m)+1000+0.02*x*200)*0.98*P1;
M1=x*0.98*0.98*P1+((i-1)*m*0.98+m*0.4)*0.02*P1;
w=(num1+num2)/(M1+M2);
b(z)=x;c(z)=m;a(z)=w;z=z+1;
end
end
zuizhi=min(a)
o=find(a==zuizhi)
b=b(o)
c=c(o)
a=a(o)
toc
第三问程序:
tic
z=1;
for x=400:700%&raquo;&raquo;&micro;&para;&Ouml;&Uuml;&AElig;&Uacute;
for a0=17:30
for q0=0.1:0.1:1
m=a0*q0;%&frac14;ì&sup2;é&frac14;&auml;&cedil;&ocirc;
M2=0;num2=0;
P1=1-normcdf(x,600,196.6291695);%&Icirc;&acute;&sup3;&ouml;&sup1;&Ecirc;&Otilde;&Iuml;&cedil;ü&raquo;&raquo;&micro;&para;&frac34;&szlig;&micro;&Auml;&cedil;&Aring;&Acirc;&Ecirc;
n=floor(x/m+1);%&frac14;ì&sup2;é&acute;&Icirc;&Ecirc;&yacute;
i=2:n; P2=normcdf(m.*i,600,196.6291695)-normcdf(m.*(i-1),600,196.6291695);%&sup3;&ouml;&sup1;&Ecirc;&Otilde;&Iuml;&cedil;ü&raquo;&raquo;&micro;&para;&frac34;&szlig;&micro;&Auml;&cedil;&Aring;&Acirc;&Ecirc; num2=sum((10.*i+3000+200*(0.6*m+(i-1).*m*0.02))*0.6.*P2+(10*mod(x,m)+1000+1500+0.02*x*200)*0.4.*P2);
M2=sum(x*0.98*0.4*P2+((i-1).*m*0.98+m*0.4)*0.60.*P2); num1=(10*i+3000+1500+200*(0.60*m+(i-1)*m*0.02))*0.02*P1+(10*floor(x/m)+1000+0.02*x*200)*0.98*P1;
M1=x*0.98*0.98*P1+((i-1)*m*0.98+m*0.4)*0.02*P1;
w=(num1+num2)/(M1+M2);
b(z)=x;c(z)=m;a(z)=w;z=z+1;
end
end
end
zuizhi=min(a)
toc
ps:只不过在第二问的基础上增加一个变量,将检查间隔m以两个变量表示,第一次检查间隔a0以及检查的公比q0,但是这样只可以求出最值,换刀周期,检查间隔以及检查次数不能直接相除得到,因为换刀的间隔不等不好用第二问的相除得到这些数据。此种情况下应该可以用循环求出。
Tags:  c语言经典程序 c语言程序下载 c语言程序 c语言程序设计

延伸阅读

最新评论

发表评论