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, :))';