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

2024-05-19 07:20

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

首先应该肯定,第一次用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
 
希望对楼主有帮助。

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

2. matlab非线性整数规划程序请教

第一个mengte是定义目标函数的m函数;
第二个是调用上述mengte函数并计算最优化值,tic toc函数表示了计算时间。

3. MATLAB并行计算问题(应该是变量传递出了问题)

一、Matlab并行计算原理梗概
Matlab的并行计算实质还是主从结构的分布式计算。当你初始化Matlab并行计算环境时,你最初的Matlab进程自动成为主节点,同时初始化多个(具体个数手动设定,详见下文)Matlab计算子节点。Parfor的作用就是让这些子节点同时运行Parfor语句段中的代码。Parfor运行之初,主节点会将Parfor循环程序之外变量传递给计算子节点。子节点运算过程时互不干扰,运算完毕,则应该有相应代码将各子节点得到的结果组合到同一个数组变量中,并返回到Matlab主节点。当然,最终计算完毕应该手动关闭计算子节点。
二十六、初始化Matlab并行计算环境
这里讲述的方法仅针对多核机器做并行计算的情况。设机器的CPU核心数量是CoreNum双核机器的CoreNum2,依次类推。CoreNum以不等于核心数量,但是如果CoreNum小于核心数量则核心利用率没有最大化,如果CoreNum大于核心数量则效率反而可能下降。因此单核机器就不要折腾并行计算了,否则速度还更慢。下面一段代码初始化Matlab并行计算环境:
%Initialize Matlab Parallel Computing Enviornment by Xaero | Macro2.cn
CoreNum=2; %设定机器CPU核心数量,我的机器是双核,所以CoreNum=2
if matlabpool('size')<=0 %判断并行计算环境是否已然启动
matlabpool('open','local',CoreNum); %若尚未启动,则启动并行环境
else
disp('Already initialized'); %说明并行环境已经启动。
end
 
运行成功后会出现如下语句:
Starting matlabpool using the 'local' configuration ... connected to 2 labs.
如果运行出错,按照下面的办法检测:
首先运行:
matlabpool size
 
如果出错,说明你没有安装Matlab并行工具箱。确认安装了此工具箱后,运行:
matlabpool open local 2;
如果出错,证明你的机器在开启并行计算时设置有问题。请联系MathWorks的售后服务。

MATLAB并行计算问题(应该是变量传递出了问题)

4. matlab中出现? Error: File: C:\Users\Administrator\Desktop\mengte.m Line: 5 Column: 29

H=exp(normrnd(3.49,0.03,1,n); 这一行明显少了一个右半括号。请补上
最后一行fprintf,里面要用单引号,即键盘上分号键右边的那个。

5. matlab和lingo结果不一样是什么原因,求大神

楼上 @sinxlg1 说的有道理,非线性优化一般会存在多个局部最优点,使用Lingo时,建议设置使用全局求解器,如图所示:

 
如果不选择全局求解器,得到的为局部最优解:

选择全局求解器之后,可以得到全局最优解:

 
MATLAB程序是用Monte-Carlo方法,即随机在给定范围内取点,如果满足所有的约束,则为可行解;如果该可行解比当前最优值更佳,则用新取的点代替原最优点。很显然这种做法需要足够多的尝试次数才有望得到比较靠谱的解,现在的设置为10^5,应该说比较大了,但并不能保证每次都得到相同的解,这是Monte-Carlo方法不可避免的偶然性。
 
在2011b之后的MATLAB版本中,遗传算法函数ga支持求解不含等式约束的混合整数规划问题,参考代码如下:
A = [ ...    1 1 1 1 1;    1 2 2 1 6;    2 1 6 0 0;    0 0 1 1 5];b = [400 800 200 200]';lb = zeros(1,5);ub = ones(1,5)*99;f=@ (x)x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);x = ga(@(x)-f(x),5,A,b,[],[],lb,ub,[],1:5)f(x) 在多数情况下,可以求出全局最优解:
x =    50    99     0    99    20ans =       51568但应该注意,遗传算法本身也是一种带有随机因素的算法,并不能保证每次都得到真正的最优结果,有时也会得到其它解,例如
x =    50    99     0    99     0ans =       50808 另外,根据你给的MATLAB程序,实际上隐含了xi>=0的约束条件。如果不考虑这个约束,实际上这个问题是无解的(xi可以取足够小的负数,目标函数趋近无穷大)。

matlab和lingo结果不一样是什么原因,求大神

6. matlab 蒙特卡罗 整数规划

(1)代码没有什么问题;运行不是总有解。例如当一次运行结果为:
p0=48.6
x0'=[3     1     0     0     6     5     0     7     7     0     0     6     1     3]
则将x0带入mengte函数,[f,g] = mengte(x0),计算得到的f和g分别为:
f=48.6
g=[2.0000    1.0000   -9.0000   -6.0000    6.0000    2.0000   -5.0000  785.7000    3.0000
24.0000 -269.7000  221.1000]

则,对应的满足约束条件。
(2) sum(g <=0)==4 的意思是g中小于等于0的元素个数正好有4个。