matlab中编写复杂函数,matlab编复杂函数

你好,这个程序已经可以运行了,不过为啥输出结果全是0 啊。您帮我看看。

clc;

clear;

close all;

Lk=1000;                                %马克链长1000

t=10;                                   %初始温度10

tf=0.001;                               %最低温度0.001

a=0.9;                                        %温度系数0.9

k=1;

a1=[8 9 10 15 15 17 15 18];

b1=[14 13 16 17 18 11 11 12];                %初始点(a1,b1)

while t>tf

for m=1:Lk

f(1)=vfunc([],[],[],a1,b1);                %f(1)为初始点的函数值

a2=a1.*(1-0.9^t);

b2=b1.*(1-0.9^t);                %产生新解(a2,b2)

f(2)=vfunc([],[],[],a2,b2);                %f(2)为新解的函数值

if f(2)-f(1)<0                        %如果新解函数值比初始解函数值小

a1=a2;

b1=b2;                        %用新解取代旧解

elseif exp((f(1)-f(2))/t)>rand        %准则接受

a1=a2;

end

temp{m,1}=a1;                                %将a(1)赋值到temp的m行1列

temp{m,2}=b1;                                %将b(1)赋值到temp的m行2列

temp{m,3}=vfunc([],[],[],a1,b1);                        %将最小函数值赋值到temp的m行3列

end

[fmin,i]=min(cell2mat(temp(:,3)));                %找出函数值的最小值且找到最小值所在的行数

a1=temp{i,1};                                %找出最小值对应的a

b1=temp{i,2};                                %找出最小值对应的b

ret1{k}=a1;                                %把a赋值给rek1变量

ret2{k}=b1;                                %把b赋值给rek2变量

se(k)=fmin;                                %把函数值赋值给se变量

k=k+1;

t=t*a;                %降温

end

[fmin I]=min(se);                        %找出函数值的最小值

I                                        %找出函数值最小值所在的行

a1=ret1(I);                                %将对应最小值的a找出

b1=ret2(I);                                %将对应最小值的b找出

a1                                        %输出a

b1                                        %输出b

fmin%输出最小函数值

tt=1:k-1;

plot(tt,se)

title('模拟退火算法求解二维Rosenbrock函数最优值');

xlabel('迭代次数');

ylabel('各代历史最优解');

函数为

function [s]=vfunc(V,Q,R,a,b)

t1=zeros(size(Q));

t2=zeros(size(R));

for i=1:8

t1=t1+a(i)*Q.^(0.2*(i-1));

t2=t2+b(i)*R.^(-0.1*(i-1));

end

v=Q.^0.3.*R.^(-0.1).*t1.*t2;

s=sum((V-v).^2);

Q=[3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2];

R=[22 24.2 29.8 21.9 24.1 29.7 21.7 23.9 29.5 21.5 23.7 29.4 21 24 30 21 23 29 21];

V=[0.86646319 0.804096194 0.682383301 1.561431619 0.778830951 0.711086254 1.419960105 0.984476313 0.864576596 1.745105103 1.343163002 1.296263098 2.02640873 1.380744198 1.18635545 2.97598251 1.768937362 1.722728725 1.302980787];

输出结果全为0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值