📄 sorgui.m
字号:
function SorGUI(keyword,varargin)
global A B X k
if nargin == 0
H = findobj(0,'Tag','SorGUi_figp');
if ~isempty(H)
warning('Another PROGRAM is running. Only 1 PROGRAM can be run at a time.');
figure(H);
return
end
init.omega = '1.4';
init.delta = '0.5e-5';
init.max1 = '1000';
omega = sym(init.omega);
delta = sym(init.delta);
max1 = sym(init.max1);
blanks = ' ';
SorGUI_figp = figure('units','normalized','pos',[0.30 0.30 0.60 .40],'menu','none', ...
'tag','SorGUI_figp',...
'Color',get(0,'DefaultUIControlBackgroundColor'), ...
'DefaultUIControlUnit','norm');
figure(SorGUI_figp);
str='逐次超松弛迭代法的通用程序';
set(gcf,'name',str,'numbertitle','off');
set(gca,'Visible','off');
set(gcf,'defaultuicontrolfontsize',11);
uicontrol('style','text','string','ω(松弛因子) ','pos',[0.68 0.82 0.2 0.10],...
'tag','omegaobj','UserData',omega);
uicontrol('pos',[.71 .73 .25 .12],'style','edit','horiz','left', ...
'backgroundcolor','white', 'tag','Somega',...
'string',[blanks char(omega)],'CallBack','SorGUI omegacallback');
uicontrol('style','text','string','ε(容许误差) ','pos',[0.68 0.62 0.2 0.10],...
'tag','deltaobj','UserData',delta);
uicontrol('pos',[.71 .53 .25 .12],'style','edit','horiz','left', ...
'backgroundcolor','white', 'tag','Sdelta',...
'string',[blanks char(delta)],'CallBack','SorGUI deltacallback');
uicontrol('style','text','string','Kmax(次) ','pos',[0.68 0.42 0.2 0.10],...
'tag','max1obj','UserData',max1);
uicontrol('pos',[.71 .33 .25 .12],'style','edit','horiz','left', ...
'backgroundcolor','white', 'tag','Smax1',...
'string',[blanks char(max1)],'CallBack','SorGUI max1callback');
uicontrol('pos',[0.40 0.82 0.25 .12],'string','读入系数矩阵', ...
'CallBack','SorGUI(''ReadA'')');
uicontrol('pos',[0.40 0.62 0.25 .12],'string','读入右端向量', ...
'CallBack','SorGUI(''ReadB'')');
uicontrol('pos',[0.10 .82 0.25 .12],'string','编辑系数矩阵', ...
'CallBack','SorGUI(''EditA'')');
uicontrol('pos',[0.10 0.62 0.25 .12],'string','编辑右端向量', ...
'CallBack','SorGUI(''EditB'')');
uicontrol('pos',[0.10 0.42 0.25 .12],'string','计算', ...
'CallBack','SorGUI(''cal'')');
uicontrol('pos',[0.40 0.42 0.25 .12],'string','查看结果', ...
'CallBack','SorGUI(''result'')');
uicontrol('pos',[0.10 0.22 0.25 .12],'string','Help', ...
'CallBack','SorGUI(''Help'')');
uicontrol('pos',[0.40 0.22 0.25 .12],'string','作者信息', ...
'CallBack','SorGUI(''Info'')');
uicontrol('pos',[0.10 0.02 0.25 .12],'string','关闭', ...
'CallBack','SorGUI(''close'')');
uicontrol('pos',[0.40 0.02 0.25 .12],'string','最优松弛因子', ...
'CallBack','SorGUI(''bestw'')');
else
switch keyword
case 'EditA'
fid=fopen('CoeMatrix.txt','a+');
open('CoeMatrix.txt');
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'EditB'
fid=fopen('MatrixB.txt','a+');
open('MatrixB.txt');
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'ReadA'
[filename,pathname]=uigetfile('.txt','打开系数矩阵数据文件');
filepath=strcat(pathname,filename);
if ~isempty(filepath)
A=load(filepath);
else
msgbox('打开文件失败','对话框','warn');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'ReadB'
[filename,pathname]=uigetfile('.txt','打开右端向量数据文件');
filepath=strcat(pathname,filename);
if ~isempty(filepath)
B=load(filepath);
else
msgbox('打开文件失败','对话框','warn');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'cal'
SorGUI_figp = findobj(0,'tag','SorGUI_figp');
omega = get(findobj(SorGUI_figp,'tag','omegaobj'),'UserData');
delta = get(findobj(SorGUI_figp,'tag','deltaobj'),'UserData');
max1 = get(findobj(SorGUI_figp,'tag','max1obj'),'UserData');
omega=subs(omega);
delta=subs(delta);
max1=subs(max1);
k=0;
if ~isempty(A)&&~isempty(B)
[X k]=sor(A,B,omega,delta,max1);
msgbox({'计算完毕','点击【查看结果】按钮查看结果'},'对话框','help');
else
msgbox('请先读入系数矩阵和右端向量数据','对话框','warn');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'result'
msgbox({'X=',['(',num2str(X'),')'],'迭代次数k=',[num2str(k)]},'解向量X','help');
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'Help'
msgbox({[' 解n阶线性方程组Ax=B的SOR方法通用程序 '],...
['* 编辑数据文件时,请严格按矩阵行和列顺序输入数值,'], ...
[' 同一行元素用空格符号隔开'], ...
['* 请勿输入其余多余的字符'], ...
['* 确保A是 n×n 阶矩阵'], ...
['* 确保B是 n×1 阶矩阵'],...
},'帮助','help');
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'Info'
msgbox({['作者:罗云标'],...
['单位:土木工程学院'], ...
['学号:050593'], ...
['Email:lyb-039@163.com'], ...
['水平有限,程序简陋'], ...
['不足之处,敬请原谅']
},'作者信息','help');
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'close'
close;
%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'bestw'
s=zeros(99,2);
SorGUI_figp = findobj(0,'tag','SorGUI_figp');
delta = get(findobj(SorGUI_figp,'tag','deltaobj'),'UserData');
max1 = get(findobj(SorGUI_figp,'tag','max1obj'),'UserData');
delta=subs(delta);
max1=subs(max1);
for i=1:99
omega2=i/50;
[X k]=sor(A,B,omega2,delta,max1);
s(i,1)=omega2;
s(i,2)=k;
end
[C I]=min(s(:,2));
omega_best=s(I,1);
kmin=C;
msgbox({'最佳松弛因子为 ',[num2str(omega_best)],'迭代次数Kmin=',[num2str(kmin)]},'最佳松弛因子','help');
%%%%%%%%%%%%%%%%%%%%%%%%%% Callback for A's edit text box.
case 'omegacallback'
omega = sym(get(gco,'String'));
set(findobj(gcf,'tag','omegaobj'),'UserData',omega);
%%%%%%%%%%%%%%%%%%%%%%%%%% Callback for A's edit text box.
case 'deltacallback'
delta = sym(get(gco,'String'));
set(findobj(gcf,'tag','deltaobj'),'UserData',delta);
%%%%%%%%%%%%%%%%%%%%%%%%%% Callback for A's edit text box.
case 'max1callback'
max1 = sym(get(gco,'String'));
set(findobj(gcf,'tag','max1aobj'),'UserData',max1);
end % switch statement for callbacks
end % end of NewtonMethod
% % 子函数
function [X k]=sor(A,B,omega,delta,max1)
N=length(B);
X=zeros(N,1);
P=zeros(N,1);
for k=1:max1
for j=1:N
if j==1
X(1)=(1-omega)*P(1)+omega*(B(1)-A(1,2:N)*P(2:N))/A(1,1);
elseif j==N
X(N)=(1-omega)*P(N)+omega*(B(N)-A(N,1:N-1)*(X(1:N-1)))/A(N,N);
else
X(j)=(1-omega)*P(j)+omega*(B(j)-A(j,1:j-1)*X(1:j-1)...
-A(j,j+1:N)*P(j+1:N))/A(j,j);
end
end
err=abs(norm(X-P));
relerr=err/(norm(X)+eps);
P=X;
if(err<delta)|(relerr<delta)
break;
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -