⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sorgui.m

📁 数值分析程序中的一个例子
💻 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 + -