MATLAB 响应面法程序为什么运行不出来?求助!!!

MATLAB 响应面法程序为什么运行不出来?求助!!!,第1张

存在四个问题:

1、从程序结构上说,代码包括三部分:

(1)第一个function(即bate2)为目标函数

(2)第二、三个function,其中st为约束条件,xym为st调用的子函数;

(3)下面这行代码以及后面的内容为主程序

Mu=[10 2.5]  %输入平均值

主程序可以作为脚本(Script)直接使用,也可以保存成一个函数。保存成函数的好处是可以把三部分代码存在同一个文件中,但需要注意,主函数必须在最前面。

2、下面这行代码多了一个逗号:

[X,fval,exitflag,output]=fmincon(@bata2,X0,A,b,Aeq,,beq,lb,ub,@st)

3、目标函数的名字为bate2,但在调用fmincon的时候写成了bata2。

4、在目标函数中使用了全局变量Mu、Sigama,但主程序中未声明其为全局变量。全局变量需要在每一个使用它的模块中都要声明,也就是说,需要在主程序中增加一行:

global Mu Sigama

另外,程序中有些应该输出的信息没有输出,却输出了一些不必输出的信息(语句后面是否加分号),也作了调整。

改写后的代码如下(可以保存斗郑在一个文件中,已作为附件上传):

function zd

global Mu Sigama  %定义全局变量

Mu=[10 2.5]  %输入平均值

Sigama=[2 0.375]   %输入标准差

X0=[10 2.5]  %输入初始迭代点

A=[]b=[]Aeq=[]beq=[]

lb=[]ub=[]

[X,fval,exitflag,output]=fmincon(@bata2,X0,A,b,Aeq,beq,lb,ub,@st)  %调用优化工具箱求解

bata=sqrt(fval)

Pf=cdf('norm',-bata,0,1)  中手%计算失效概率

function CC=bata2(X)  %目标函数子函数

global Mu Sigama  %定义全局变量

CC=((X(1)-Mu(1))/Sigama(1))^2+((X(2)-Mu(2))/Sigama(2))^2  %X均为正态分布

 

function [c,ceq]=st(X)   %约束条件子函数

c=[]  %非线性不等式约束

ceq=xym(X)   %非线性等式约束

 

function Z=xym(X)  %响应面函数子函数

A1=[1.0000 10.0000 2.5000 100.0000 6.2500

    1.0000 16.0000 2.5000 256.0000 6.2500

    1.0000 4.0000 2.5000 256.0000 6.2500

    1.0000 10.0000 3.6250 100.0000 13.1406

    1.0000 10.0000 1.3750 100.0000 1.8906]

B1=[13.672810.800516.545116.8897-10.3136]

C=A1\B1 %求解二次响应面函数各项系数

Z=C(1)+C(2)*X(1)+C(3)*X(2)+C(4)*X(1)+C(5)*X(2)  %计算功能函数值

运行结果如下:

Optimization terminated: first-order optimality measure less

 than options.TolFun and maximum constraint violation is less

 than options.TolCon.

X =

   10.2991    1.5136

fval =

    6.9410

exitflag =

     1

output =

       iterations: 3

        funcCount: 12

   卖销嫌  lssteplength: 1

         stepsize: 0.1441

        algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'

    firstorderopt: 8.5143e-008

          message: [1x144 char]

Pf =

    0.0042

matlab中用最小二乘拟合的常用函数有polyfit(多项式拟合)、nlinfit(非线性拟合)以喊睁及regress(多元线性回归)。自变量有2个或以上时,应变量一个,可以使用的有nlinfit和regress,线性时用regress,非线性时用nlinfit。对于进阶matlab使用者还有更多的选择,如拟合工具箱、fit函数、interp系列插值拟合等等。

具体介绍一下regress

regress虽然名义上只能做线性回归但是可以把x^2等非线性量作为一个额外自变量做计算,轮腊因此在一些特殊情况下也可以做非线性拟合。

以matlab自带的数据为样本,示例代码如下:(%后面的是注释)

clcclear

load carsmall%此数据样本matlab自带

x=Weighty=Horsepowerz=MPG%取这3个变量作为拟合对郑桐岁象,x、y自变量,z应变量

plot3(x,y,z,'p')

hold on

c=ones(length(x),1)

b=regress(z,[x,y,c])%纯线性拟合 模型z=b(1)*x+b(2)*y+b(3)

[X,Y]=meshgrid(linspace(1500,5000,10),linspace(40,240,10))

C=ones(10)

mesh(X,Y,b(1)*X+b(2)*Y+b(3)*C)

grid on

b=regress(z,[x.^2,y.^2,x.*y,x,y,c])%添加非线性项进行拟合

figure

plot3(x,y,z,'p')

hold on

mesh(X,Y,b(1)*X.^2+b(2)*Y.^2+b(3)*X.*Y+b(4)*X+b(5)*Y+b(6)*C)

grid on


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12391689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存