Introduction

一个用来寻找最优参数的函数。

Usage

基本情况

最简单的情况:二元函数,找到这个函数在哪里可以取到最小值,找到对应的自变量和函数值。

% 定义目标函数
fun = @(x) (x(1)-2)^2 + (x(2)-3)^2;
% 初始猜测值
x0 = [0, 0];
% 使用 fminsearch 进行优化
[x, fval] = fminsearch(fun, x0);
% 输出结果
disp('最优解:');
disp(x);
disp('目标函数在最优解处的值:');
disp(fval);

这个时候 fminsearch函数需要两个传入参数,分别是 fun目标函数和 x0初始条件。这里目标函数采用了匿名函数的写法。

进阶情况

对于传入多个参数,并不所有参数都需要找到最优值的情况:先定义目标函数

function result = myfun(x, a, b)
    result = a*(x(1)-2)^2 + b*(x(2)-3)^2;
end

使用 fminsearch进行优化:

% 固定参数
fixed_a = 2;
fixed_b = 3;

% 初始猜测值
x0 = [0, 0];
[x, fval] = fminsearch(@(x) myfun(x, fixed_a, fixed_b), x0); 
% 指出哪个参数需要被优化即可

作业情况

目标函数比较复杂,需要比较理论值和实验值的差别:

function F = find_best_params(params, t, y)
    % 创建传递函数模型
    b3 = params(1);
    b2 = params(2);
    b1 = params(3);
    b0 = params(4);
    a3 = params(5);
    a2 = params(6);
    a1 = params(7);
    a0 = params(8);
    den = [a3, a2, a1, a0];
    num = [b3, b2, b1, b0];
    mod = tf(num, den);
  
    % 计算阶跃响应并计算误差
    ymod = step(mod, t);
    m = y - ymod;
    F = sum(m.^2);
end

只需要最终构建出我们希望让值最小的变量就可以了,将其作为函数的返回值。

然后注意指出需要优化哪个(哪些)参数:

best_params = fminsearch(@(params) find_best_params(params, t, y), params0);
% params0是初始值

Extraneous

当我们传入的参数是行向量的时候,需要换成列向量,才能让 fminsearch函数对其进行处理。例如:

load hw4top.mat 
% 加载一个文件
t = (out_signal(1, :))';
% 对文件中的变量进行切片,取到一个行向量,转置成列向量
y = (out_signal(2, :))';
最后修改:2024 年 05 月 13 日
如果觉得我的文章对你有用,请随意赞赏