Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB';s lsqnonlin解算器远离解_Matlab_Optimization_Mathematical Optimization_Solver - Fatal编程技术网

MATLAB';s lsqnonlin解算器远离解

MATLAB';s lsqnonlin解算器远离解,matlab,optimization,mathematical-optimization,solver,Matlab,Optimization,Mathematical Optimization,Solver,我有一个拟合问题,我正试图用MATLAB的lsqnonlin函数来解决,但它做得很差。特别是,如果我给它实际的解决方案作为起点,解算器继续从那里移开(尽管拟合函数为该输入返回一个全零的向量),并产生可怕的结果。下面是我的代码,但有点长,所以我对此表示歉意,但我不确定到底是什么原因导致了这种行为,因为在其他情况下没有关系 安装_demo.m: % Parameters for image imagemat = zeros(32, 32); x_centre = 5; y_centre = -10;

我有一个拟合问题,我正试图用MATLAB的
lsqnonlin
函数来解决,但它做得很差。特别是,如果我给它实际的解决方案作为起点,解算器继续从那里移开(尽管拟合函数为该输入返回一个全零的向量),并产生可怕的结果。下面是我的代码,但有点长,所以我对此表示歉意,但我不确定到底是什么原因导致了这种行为,因为在其他情况下没有关系

安装_demo.m:

% Parameters for image
imagemat = zeros(32, 32);
x_centre = 5; y_centre = -10; radius = 3; psf_sigma = 1; height = 1;

% Generate image to fit
actual_image = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat);

figure

% Plot actual image
subplot(2, 1, 1)
imagesc(actual_image)
axis equal
title('Actual image')

% Set up fitting function
x0 = [x_centre, y_centre, radius, psf_sigma, height]; % The solver starts from the solution!
f = @(x)fit_image_sphere_thin(x, imagemat);

% Fit
options = optimoptions(@lsqnonlin, 'Display', 'iter');
[fit, resnorm, residual, exitflag, output] = lsqnonlin(f, x0, [], [], options);

% Display image generated using fitted parameters
subplot(2, 1, 2)
imagesc(image_sphere_thin(fit(1), fit(2), fit(3), fit(4), fit(5), imagemat))
axis equal
title('Fitted image')
fit_image_sphere_thin.m:

function deltas = fit_image_sphere_thin(x0, actual_image)

x_centre       = x0(1);
y_centre       = x0(2);
radius         = x0(3);
% psf_sigma      = x0(4); % Commented out to stop crazy things
psf_sigma = 1;
% height         = x0(5); % Commented out to stop crazy things
height = 1;

imagemat = zeros(size(actual_image));

sim_image = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat);

sim_vector = sim_image(:);
actual_vector = actual_image(:);

deltas = actual_vector - sim_vector;

end
function I = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat)

image_width = size(imagemat, 2);
image_height = size(imagemat, 1);

image_centre_x = image_width / 2;
image_centre_y = image_height / 2;

x = (1:image_width) - image_centre_x;
y = -(1:image_height) + image_centre_y;

[x, y] = meshgrid(x, y);
X = [x(:) y(:)];

image_vector = cross_section_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, X);

imagemat = reshape(image_vector, size(imagemat));
I = imagemat;

end
function I = cross_section_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, X)

r = sqrt((X(:, 1) - x_centre).^2 + (X(:, 2) - y_centre).^2);
psf_variance = psf_sigma^2;
I = height * (exp(-(r - radius).^2 / (2 * psf_sigma)) - exp(-(r + radius).^2 / (2 * psf_sigma))) ./ r;
I(r == 0) = (2 * radius * height / psf_variance) * exp(-(radius^2) / (2 * psf_variance));

end
图像\u球体\u薄.m:

function deltas = fit_image_sphere_thin(x0, actual_image)

x_centre       = x0(1);
y_centre       = x0(2);
radius         = x0(3);
% psf_sigma      = x0(4); % Commented out to stop crazy things
psf_sigma = 1;
% height         = x0(5); % Commented out to stop crazy things
height = 1;

imagemat = zeros(size(actual_image));

sim_image = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat);

sim_vector = sim_image(:);
actual_vector = actual_image(:);

deltas = actual_vector - sim_vector;

end
function I = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat)

image_width = size(imagemat, 2);
image_height = size(imagemat, 1);

image_centre_x = image_width / 2;
image_centre_y = image_height / 2;

x = (1:image_width) - image_centre_x;
y = -(1:image_height) + image_centre_y;

[x, y] = meshgrid(x, y);
X = [x(:) y(:)];

image_vector = cross_section_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, X);

imagemat = reshape(image_vector, size(imagemat));
I = imagemat;

end
function I = cross_section_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, X)

r = sqrt((X(:, 1) - x_centre).^2 + (X(:, 2) - y_centre).^2);
psf_variance = psf_sigma^2;
I = height * (exp(-(r - radius).^2 / (2 * psf_sigma)) - exp(-(r + radius).^2 / (2 * psf_sigma))) ./ r;
I(r == 0) = (2 * radius * height / psf_variance) * exp(-(radius^2) / (2 * psf_variance));

end
横截面球薄.m:

function deltas = fit_image_sphere_thin(x0, actual_image)

x_centre       = x0(1);
y_centre       = x0(2);
radius         = x0(3);
% psf_sigma      = x0(4); % Commented out to stop crazy things
psf_sigma = 1;
% height         = x0(5); % Commented out to stop crazy things
height = 1;

imagemat = zeros(size(actual_image));

sim_image = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat);

sim_vector = sim_image(:);
actual_vector = actual_image(:);

deltas = actual_vector - sim_vector;

end
function I = image_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, imagemat)

image_width = size(imagemat, 2);
image_height = size(imagemat, 1);

image_centre_x = image_width / 2;
image_centre_y = image_height / 2;

x = (1:image_width) - image_centre_x;
y = -(1:image_height) + image_centre_y;

[x, y] = meshgrid(x, y);
X = [x(:) y(:)];

image_vector = cross_section_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, X);

imagemat = reshape(image_vector, size(imagemat));
I = imagemat;

end
function I = cross_section_sphere_thin(x_centre, y_centre, radius, psf_sigma, height, X)

r = sqrt((X(:, 1) - x_centre).^2 + (X(:, 2) - y_centre).^2);
psf_variance = psf_sigma^2;
I = height * (exp(-(r - radius).^2 / (2 * psf_sigma)) - exp(-(r + radius).^2 / (2 * psf_sigma))) ./ r;
I(r == 0) = (2 * radius * height / psf_variance) * exp(-(radius^2) / (2 * psf_variance));

end

您好,请记住发布被调用函数所属的
matlab
版本和工具箱(如果有)。同时,尝试生成图像文件并提取要馈送到
lsqnonlin
的任何片段,看看会发生什么。目前,您已经通过许多函数和扭曲来运行数据,因此没有简单的方法来验证您是否已向拟合函数发送了有效数据。您好,请记住发布被调用函数所属的
matlab
版本和工具箱(如果有)。同时,尝试生成图像文件并提取要馈送到
lsqnonlin
的任何片段,看看会发生什么。目前,您已经通过许多函数和扭曲来运行数据,因此没有简单的方法来验证您是否已将有效数据发送到拟合函数。