作业帮 > 综合 > 作业

用matlab解非线性函数,刚入门的

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/10/04 03:39:12
用matlab解非线性函数,刚入门的
如题,

我第一次用matlab,新建了个m文件
编辑:
function [f,g]=mengte(x);
f=x(1)^2+2*x(2)+3*x(3)^3+x(4)^2-8
g=[-x(1)^2+x(2)-x(3)^2
    x(1)+x(2)^2+x(4)-28
    x(1)+x(3)+x(4)^2-40
    x(3)^2+x(4)^2-64
    -x(1)
    -x(2)
    -x(3)
    -x(4)]
保存好又新建了个m文件输入:
rand('state',sum(clock))
x0=0;p0=0
tic
for i=1:10^6
    x1=floor(x),x2=ceil(x);
    [f,g]=mengte(x1);
    if sum(g<=0)==8
        if p0<=f
            x0=x1;p0=f
        end
    end
    [f,g]=mengte(x2)
    if sum (g<=0)==8
        if p0<=f
            x0=x2;p0=f
        end
    end
end
x0,p0
是不是不对?那第二个是不是应该在指令框内输入? 
还有我程序有没有问题呢?在线求达人指导
此外我还想知道如何把这2个程序连接起来
首先应该肯定,第一次用matlab写程序写到这个水准,应该算是相当不错的.不过,毕竟是第一次,问题当然也不少,后面细说.
第二个m文件保存好在命令窗口(Command Window,也就是你说的指令框)中运行即可.需要注意的是,MATLAB的m文件命名有要求——去掉扩展名“.m”之后的余下部分必须是一个合法的变量名,即以字母开始的字母、数字及下划线序列.
如果想把两个文件合并成一个文件,需要把第二段程序放在前面,并且在前面加上function xxx(xxx是函数名,任意自定),作为该M文件的主函数.
说一说程序存在的问题:
第2段程序的x未定义,我猜,那应该是你想要生成的随机数.
有多处语句没有使用分号(;)结束,计算时把结果在屏幕上回显,会导致速度很慢.
关于目标函数初值:p0的初值不适合设为0,因为你很难保证实际计算的目标函数比0更小.最稳妥的应该取p0的初值为无穷大(Inf).
关于判断条件:既然是求min,那么更好解的条件应该是p0>=f,你刚好写反了.
 
我有几个问题搞不清楚:
看到你在程序中对x求ceil和floor,你的问题是一个整数规划问题吗?
你使用蒙特卡洛法求解的话,随机数应该有范围的,但目前这一点不清楚.
你为什么要用蒙特卡洛法求解这个优化问题,而不是使用优化工具箱提供的函数呢?
 
对你程序做了一些修改,合并到一个m文件,代码如下:
function zd533612231

rand('state',sum(clock))
x0=0;p0=Inf;
tic
for i=1:10^6
    x=rand(1,4)*100;
    x1=floor(x);x2=ceil(x);
    [f,g]=mengte(x1);
    if sum(g<=0)==8
        if p0>=f
            x0=x1;p0=f
        end
    end
    [f,g]=mengte(x2);
    if sum (g<=0)==8
        if p0>=f
            x0=x2;p0=f
        end
    end
end
x0,p0 

function [f,g]=mengte(x)

f=x(1)^2+2*x(2)+3*x(3)^3+x(4)^2-8;
g=[-x(1)^2+x(2)-x(3)^2
    x(1)+x(2)^2+x(4)-28
    x(1)+x(3)+x(4)^2-40
    x(3)^2+x(4)^2-64
    -x(1)
    -x(2)
    -x(3)
    -x(4)];
 
 
运行得到结果(因为是随机的,不同次运行结果可能存在差别):
x0 =
     3     3     0     1
p0 =
     8
 
再问: ceil和floor应该是没的吧,不是很清楚这个和整数的矛盾,但无妨 老师要求用蒙特卡洛法,我也只能用这个方法,范围没有 还是谢谢你了,这么认真的回复我 然后就是function zd533612231是随便的名字就行的吗 其次x的定义 我确实漏了,因为当时我不知道范围,后来就忘了怎么去定义。程序一直出错 还有怎么在command window里运行那个文件呢? 明白怎么运行了,但为什么运行出来4个x值但这么多p0值
再答: 1、ceil和floor都是取整函数,你把在计算目标寒之前先把变量取整,这就意味着是一个整数规划问题,而整数规划和非整数规划从方法上来说差别很大,不能认为无妨。 2、优化变量如果没指定范围,需要自己从约束条件做一些分析,确定大概的范围,否则生成的随机数可能根本不在目标函数最小的区域,而如果把范围取太大,则有效落到最优点附近的可能性又会降低很多。 3、函数名 zd533612231是随便取的,我是根据百度知道的问题编号命名,你可以随便改(但要注意M文件命名的基本要求)。 4、你把这些代码存到一个M文件里,在编辑器中按F5运行即可。或者在Command Window中输入刚才保存的文件名(不要“.m”),然后回车。 5、出来多个p0值是在优化过程中显示的中间结果,我是用它来观察优化的过程,但为了避免输出信息太多,中间过程的x没有输出。你只需要关心最后一组结果就行了。