找回密码
 注册
Simdroid-非首页
查看: 117|回复: 4

二次插值最优程序

[复制链接]
发表于 2011-4-27 10:26:56 | 显示全部楼层 |阅读模式 来自 福建福州
这是编程得二次插值求最优的程序
function [xo,yo]=opt_quadratic(f,x,tolx,tolfun,maxiter)
% 用二次插值求f(x)最优解
% f:函数名
% x:给出搜索区间
% tolx:最优值点间的误差阈值
% tolfun:函数的误差阈值
% maxiter:最大迭代次数
% xo:最优化点值
% fo:函数在点xo处的函数值
% 根据输入确定三点的初始值,并求出对应的函数值
if length(x)>2
    x012=x(1:3);
else
    if length(x)==2
    a=x(1);
    b=x(2);
    else
    a=x-10;
    b=x+10;
    end
x012=[a (a+b)/2 b];
end
f012=f(x012);
% 初始化三点值
x0=x012(1);
x1=x012(2);
x2=x012(3);
f0=f012(1);
f1=f012(2);
f2=f012(3);
% 求出插值二项式的取最小值处的x3以及相应的最小值f3
nd=[f0-f2 f1-f0 f2-f1]*[x1*x1 x2*x2 x0*x0;x1 x2 x0]';
x3=nd(1)/2/nd(2);
f3=feval(f,x3);
% 判断是否迭代终止
if maxiter<=0||abs(x3-x1)<tolx||abs(f3-f1)<tolfun
    xo=x3;
    yo=f3;
elseif x3<x1
    if f3<f1
        x012=[x0 x3 x1];
        f012=[f0 f3 f1];
    else
        x012=[x3 x1 x2];
        f012=[f3 f1 f2];
    end
else
    if f3<=f1
    x012=[x1 x3 x2];
    f012=[f1 f3 f2];
    else
    x012=[x0 x1 x3];
    f012=[f0 f1 f3];
    end
% 进行新一轮的迭代
[xo,yo]=opt_quadratic(f,x012,tolx,tolfun,maxiter-1);
end


调用程序如下:
f1502=inline('(x.*x-2).^2/2-1','x');
a=0;
b=5;
tolx=1e-5;
tolfun=1e-8;
maxiter=100;
[xop,fop]=opt_quadratic(f1502,[a,b],tolx,tolfun,maxiter)

为什么老是出现如下错误:
Error in ==> opt_quadratic at 11
if length(x)>2
??? Output argument "xo" (and maybe others) not assigned during call to "D:\Program
Files\MATLAB\R2010b\bin\最优化计算\opt_quadratic.m>opt_quadratic".
Error in ==> Untitled at 7
[xop,fop]=opt_quadratic(f1502,[a,b],tolx,tolfun,maxiter)
发表于 2011-4-27 13:29:25 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
你在程序中没有把要输出的结果赋值给xo,yo,或者你的判断条件可能冲突,输出不了xo,yo
if maxiter<=0||abs(x3-x1)<tolx||abs(f3-f1)<tolfun,

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-29 18:10:04 | 显示全部楼层 来自 福建福州
2# 活耗子
单纯看这个错误的信息的话,我也晓得,就是这个看来看去,算法一点问题没有,不晓得改哪里?
回复 不支持

使用道具 举报

发表于 2011-5-1 16:54:45 | 显示全部楼层 来自 黑龙江哈尔滨
你确定“算法一点问题没有”?
回复 不支持

使用道具 举报

发表于 2011-5-13 17:04:19 | 显示全部楼层 来自 山西太原
是你调用的时候跟主函数不一致造成的。
  1. fun=inline('(x.*x-2).^2/2-1','x');
  2. a=0;
  3. b=5;
  4. x=[a:b];
  5. tolx=1e-5;
  6. tolfun=1e-8;
  7. maxiter=100;
  8. [xop,yop]=opt_quadratic(fun,x,tolx,tolfun,maxiter)
复制代码
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 19:25 , Processed in 0.029387 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表