无法使用网格创建

时间:2018-11-25 10:28:13

标签: matlab plot octave

所以我有一个脚本,该脚本执行二次函数的坐标下降算法。我还创建了一个函数来绘制不同的图,这是我添加的第一部分。代码执行时没有任何错误,但是我看不到表面,只能看到算法的路径递减。

功能更新器:

function [f,delta] = fcalculator (Q, x0, c, p)
 a = size(x0);
 n = a(2);
 f = (x0*Q*x0') - (c * x0') + p ;
 delta = (Q*x0')- c';
endfunction

主程序:

clear all, close all,
fprintf(' 0 = probleme specifique \n 1 = probleme random \n 2 = Tapez votre propre probleme\n')
choix = input ('Choix :  ');
n=0;
if (choix == 0)

  [Q, x0, c, p] = quadfunctiongenerator(n,choix)

  maxiter = input ( 'Nombre de iterations :'); 
  [x, z] = coordinatedescent(Q,c,p,x0,maxiter);
  visualizer(x, z, Q, c, p);

else

  n = input ('Choix des dimensions: n = ');
  [Q, x0, c, p] = quadfunctiongenerator(n,choix);

endif

创建图的模块:

function [x1, x2, fuf] = visualizer(x, z, Q, c, p)
clf;
% Pour le cas le plus general, apres on fera:
% iters = 1:size(x)(1);
% plot(iters,x(:,1))
if size(x)(2)
  % Afficher les iterees: 
  plot3(x(:,1), x(:,2), z)
  hold on;
  % fcalculator (Q, x0, c, p)

  % Display the function's surface:
  %% Calculate limits:
  x1_low = x(1,1);
  x1_hi  = x(size(x)(1),1) + x1_low;
  x2_low = x(1,2);
  x2_hi  = x(size(x)(1),2) + x2_low;

  % Resolution will be the number of points:
  resolution = 100;
  x1 = (linspace(x1_low, x1_hi, resolution))';
  x2 = (linspace(x2_low, x2_hi, resolution))';
  f = [];

  [xx, yy] = meshgrid (x1, x2);

  for i=1:resolution
    for j=1:resolution
      [_tmp, _] = fcalculator(Q, [x1(i),x2(j)], c, p);
      f(i,j) = _tmp;
    endfor
  endfor 

  _string = sprintf('%d ', size(x1));
  fprintf('Answer: %s\n', _string);

  _string = sprintf('%d ', size(x2));
  fprintf('Answer: %s\n', _string);

  _string = sprintf('%d ', size(f));
  fprintf('Answer: %s\n', _string);

  mesh(x1, x2, f);

endif

endfunction

我认为问题在于我对mesh()的调用,因为我没有使用在调用xx时创建的变量yymeshgrid(),而是{{1 }},x1x2与用于创建著名的阔边形图的变量相同:

f

我应该像草稿图示例所示将f创建为元素操作吗?

是否有八度音阶函数可以帮助我创建要优化的函数的表面?

1 个答案:

答案 0 :(得分:0)

我发现了问题。对mesh()的呼叫是正确的。问题在于边界的定义。

  x1_low = x(1,1);
  x1_hi  = x(size(x)(1),1) + x1_low;
  x2_low = x(1,2);
  x2_hi  = x(size(x)(1),2) + x2_low;

产生了x1_low == x1_hi。该代码被替换为:

 x1_low = min(x(:,1));
 x1_hi  = max(x(:,1));
 x2_low = min(x(:,2));
 x2_hi  = max(x(:,2));

产生所需的表面。