我正在寻求帮助..我想在 Matlab 上为 Kaczmarz 方法制作动画。它的方法允许通过在超平面上的串行投影解向量来找到方程组的解,该解向量由系统方程组给出。
我想制作该矢量移动的动画(就像该点在投影矢量上一样)。
%% System of equations
% 2x + 3y = 4;
% x - y = 2;
% 6x + y = 15;
%%
A = [2 3;1 -1; 6 1];
f = [4; 2; 15];
resh = pinv(A)*f
x = -10:0.1:10;
e1 = (1 - 2*x)/3;
e2 = (x - 2);
e3 = 15 - 6*x;
plot(x,e1)
grid on
%
axis([0 4 -2 2])
hold on
plot(x,e2)
hold on
plot(x,e3)
hold on
precision = 0.001; % точность
iteration = 100; % количество итераций
lambda = 0.75; % лямбда
[m,n] = size(A);
x = zeros(n,1);
%count of norms
for i = 1:m
nrm(i) = norm(A(i,:));
end
for i = 1:1:iteration
j = mod(i-1,m) + 1;
if (nrm(j) <= 0), continue, end;
predx = x;
x = x + ((f(j) - A(j,:)*x)*A(j,:)')/(nrm(j))^2;
p = plot(x);
set(p)
%pause 0.04;
hold on;
if(norm(predx - x) <= precision), break, end
end
我为这个方法编写了代码,不想象如何制作动画,如何使用set
功能。
在你的代码中有很多冗余和随机的部分。不要打电话hold on
不止一次,它什么也没做。还set(p)
什么都不做,你想设置一些p
s 属性,然后你使用set
.
另外,您正在绘制结果,而不是“变化”。更改是前一个和当前之间的一条线,这是您想要使用变量的唯一原因,例如predx
, 进行绘图。所以用它吧!
不管怎样,下面的代码绘制了你的算法。我添加了一条重复的线以绿色绘制,然后删除,这样您就可以看到最后一步的作用。我还改变了乞讨中的情节,只用红色绘制,这样更清楚每件事是什么。
将循环更改为:
for i = 1:1:iteration
j = mod(i-1,m) + 1;
if (nrm(j) <= 0), continue, end;
predx = x;
x = x + ((f(j) - A(j,:)*x)*A(j,:)')/(nrm(j))^2;
plot([predx(1) x(1)],[predx(2) x(2)],'b'); %plot line
c=plot([predx(1) x(1)],[predx(2) x(2)],'g'); %plot it in green
pause(0.1)
children = get(gca, 'children'); %delete the green line
delete(children(1));
drawnow
% hold on;
if(norm(predx - x) <= precision), break, end
end
这将显示:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)