用matlab解非线性函数,刚入门的如题,我第一次用matlab,新建了个m文件编辑:function [f,g]=mengte(x);f=x(1)^2+2*x(2)+3*x(3)^3+x(4)^2-8g=[-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(
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/19 21:44:14
用matlab解非线性函数,刚入门的如题,我第一次用matlab,新建了个m文件编辑:function [f,g]=mengte(x);f=x(1)^2+2*x(2)+3*x(3)^3+x(4)^2-8g=[-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(
用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解非线性函数,刚入门的如题,我第一次用matlab,新建了个m文件编辑:function [f,g]=mengte(x);f=x(1)^2+2*x(2)+3*x(3)^3+x(4)^2-8g=[-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(
首先应该肯定,第一次用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