声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 7282|回复: 28

[编程技巧] sym变量如何显示的问题

[复制链接]
发表于 2007-4-8 14:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
运行以下程序
syms h
h1=-1/(4*3/(pi*h)*sqrt(1-(1/h)^2))-7.07;
[h]=solve(h1,h)

结果是:
h =

1.0391
3.6756

我要将h的结果显示在Edit Text中
但是我用
set(findobj('tag','edit12'),'string',h);

显示错误
??? Error using ==> set
Conversion to double from sym is not possible.

Error in ==> feixianxing>pushbutton3_Callback at 607
set(findobj('tag','edit12'),'string',z);

Error in ==> gui_mainfcn at 75
        feval(varargin{:});

Error in ==> feixianxing at 42
    gui_mainfcn(gui_State, varargin{:});

我把h转为h=num2str(h);
也不对
怎么弄啊!

[ 本帖最后由 eight 于 2007-4-27 18:55 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-4-8 16:12 | 显示全部楼层
原帖由 jennychung 于 2007-4-8 14:49 发表
运行以下程序
syms h
h1=-1/(4*3/(pi*h)*sqrt(1-(1/h)^2))-7.07;
=solve(h1,h)

结果是:
h =

1.0391
3.6756

我要将h的结果显示在Edit Text中
但是我用
set(findobj('tag','edit12'),'string ...



help subs, the answer is: h = subs(h)
 楼主| 发表于 2007-4-8 16:49 | 显示全部楼层
subs()不是替换吗
不对啊
发表于 2007-4-8 16:52 | 显示全部楼层
原帖由 jennychung 于 2007-4-8 16:49 发表
subs()不是替换吗
不对啊


以下是我运行的结果:


  1. >> syms h
  2. h1=-1/(4*3/(pi*h)*sqrt(1-(1/h)^2))-7.07;
  3. [h]=solve(h1,h)

  4. h =

  5. -1/50*2121^(1/2)/pi*(2121+50*pi)^(1/2)-1/50/pi*(4498641-106050*pi)^(1/2)
  6. -1/50*2121^(1/2)/pi*(2121+50*pi)^(1/2)+1/50/pi*(4498641-106050*pi)^(1/2)


  7. >> vpa(h)

  8. ans =

  9. -26.986864109735927904304945785532
  10.   -1.000687246729425731400525817088


  11. >> subs(h)
  12. ans =
  13.   -26.9869
  14.    -1.0007
复制代码


最后的ans是double型
 楼主| 发表于 2007-4-8 16:58 | 显示全部楼层
我的程序的一部分是
syms h
        w=1/sqrt(T1*T2);
        Gn=K/(j*w*(T1*j*w+1)*(j*w*T2+1));
        U=real(Gn);
        U=vpa(U,4);
        h1=-pi*h/(4*k)*sqrt(1-(e0/h)^2)-U;
        [h]=solve(h1,h);
end
ping1=num2str(w);
set(findobj('tag','edit11'),'string',ping1);
set(findobj('tag','edit12'),'string',h);

我要将h的结果显示在Edit Text中
但是显示错误
不知道怎么弄了
发表于 2007-4-8 17:05 | 显示全部楼层
原帖由 jennychung 于 2007-4-8 16:58 发表
我的程序的一部分是
syms h
        w=1/sqrt(T1*T2);
        Gn=K/(j*w*(T1*j*w+1)*(j*w*T2+1));
        U=real(Gn);
        U=vpa(U,4);
        h1=-pi*h/(4*k)*sqrt(1-(e0/h)^2)-U;
        =sol ...


按照我的方法应该没有问题的,你贴的代码不完整,无法运行,因此无法知道出错信息
 楼主| 发表于 2007-4-8 17:11 | 显示全部楼层
代码还是很长啊
简单一下:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
hk1=findobj('tag','edit4');K=str2num(get(hk1,'string'));
ht1=findobj('tag','edit5');T1=str2num(get(ht1,'string'));
ht2=findobj('tag','edit6');T2=str2num(get(ht2,'string'));
hlei1=findobj('tag','popupmenu2');lei1=get(hlei1,'value');
axes(handles.axes1);
switch lei1
    case 1
        ks=2;e0=1;  %gai
        for A=1.1:0.1:20;
            x=2*ks/pi*(asin(e0/A)+e0/A*sqrt(1-(e0/A)^2));
            y=0;
            plot(-1/x,y,'m');
            hold on
        end
        num=[K];den=conv(conv([1 0],[T1 1]),[T2 1]);  
        G=tf(num,den);
        w1=1.8:0.1:20;
        nyquist(G,w1);hold off;        
        %A w
        syms h
        w=1/sqrt(T1*T2);
        Gn=K/(j*w*(T1*j*w+1)*(j*w*T2+1));
        U=real(Gn);
        U=vpa(U,4);
        h1=-1/(2*ks/pi*(asin(e0/h)+e0/h*sqrt(1-(e0/h)^2)))-U;
        [h]=solve(h1,h);
    case 2        
        .....
    case 3        
        ....
    case 4        
        ....
    case 5        
        ....
end
ping1=num2str(w);z=subs(h);
set(findobj('tag','edit11'),'string',ping1);
set(findobj('tag','edit12'),'string',z);
发表于 2007-4-8 17:15 | 显示全部楼层
原帖由 jennychung 于 2007-4-8 17:11 发表
代码还是很长啊
简单一下:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version  ...



你这个是GUI中某个函数的代码,贴出来也没用,我一样无法运行,你不如自己调试一下,在z=subs(h)那里设置一个断点,然后看出现什么问题了。如果能够自己解决就最好,不能解决的话再把运行到哪一步出错、还有其出错信息贴上来吧
 楼主| 发表于 2007-4-8 17:18 | 显示全部楼层
设段点在z=subs(h)

显示错误
??? Error using ==> set
Conversion to double from sym is not possible.

Error in ==> feixianxing>pushbutton3_Callback at 607
set(findobj('tag','edit12'),'string',z);

Error in ==> gui_mainfcn at 75
        feval(varargin{:});

Error in ==> feixianxing at 42
    gui_mainfcn(gui_State, varargin{:});

[ 本帖最后由 jennychung 于 2007-4-8 17:23 编辑 ]
发表于 2007-4-8 17:30 | 显示全部楼层
不可能吧,你用以下代码试试,看得到的z是否double型的:

  1. syms h
  2. h1=-1/(4*3/(pi*h)*sqrt(1-(1/h)^2))-7.07;
  3. [h]=solve(h1,h);
  4. a=subs(h);
  5. whos a
复制代码


我的结果:
  Name      Size                    Bytes  Class
  a         2x1                        16  double array
Grand total is 2 elements using 16 bytes
 楼主| 发表于 2007-4-8 17:38 | 显示全部楼层
就运
syms h
h1=-1/(4*3/(pi*h)*sqrt(1-(1/h)^2))-7.07;
[h]=solve(h1,h);
a=subs(h);
whos a
的话,是double型的

但是在我的程序里运出来就是不对啊

double型的是不是也是用num2str转成 string型的呢?
edit text 的string属性是要输入string类型的
发表于 2007-4-8 17:41 | 显示全部楼层
原帖由 jennychung 于 2007-4-8 17:38 发表
就运
syms h
h1=-1/(4*3/(pi*h)*sqrt(1-(1/h)^2))-7.07;
=solve(h1,h);
a=subs(h);
whos a
的话,是double型的

但是在我的程序里运出来就是不对啊

double型的是不是也是用num2str转成 string型的呢 ...


一般情况下不需要人工转换,double型的变量在text、edit控件上显示的时候默认会转换为string型的

如果上面的测试得到的是double型,那证明你的问题不在那里,你先 clear all 删除所有变量的值,然后 clc 清屏,再设置断点,再运行一次看看吧
 楼主| 发表于 2007-4-8 18:01 | 显示全部楼层
我不用GUI运行
就在matlab里运行如下代码的话是对的

syms w w1 x y A U Gn h1 h;
K=input('K=')
T1=input('T1=')
T2=input('T2=')
k=2;e0=1;  %gai
for A=1.1:0.1:20;
    x=2*k/pi*(asin(e0/A)+e0/A*sqrt(1-(e0/A)^2));
    y=0;plot(-1/x,y,'m')
    hold on
end
num=[K];den=conv(conv([1 0],[T1 1]),[T2 1]);  
G=tf(num,den);
w1=1.8:0.1:20;
nyquist(G,w1)
%A w
Kc=sym(num2str(K));Tc1=sym(num2str(T1));Tc2=sym(num2str(T2));
w=1/sqrt(Tc1*Tc2)
Gn=Kc/(j*w*(Tc1*j*w+1)*(j*w*Tc2+1));
U=real(Gn);
U=vpa(U,4);
h1=-1/(2*k/pi*(asin(e0/h)+e0/h*sqrt(1-(e0/h)^2)))-U;
[h]=solve(h1,h)

但是在GUI里运行
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
hk1=findobj('tag','edit4');K=str2num(get(hk1,'string'));
ht1=findobj('tag','edit5');T1=str2num(get(ht1,'string'));
ht2=findobj('tag','edit6');T2=str2num(get(ht2,'string'));
hlei1=findobj('tag','popupmenu2');lei1=get(hlei1,'value');
axes(handles.axes1);
switch lei1
    case 1
        ks=2;e0=1;  %gai
        for A=1.1:0.1:20;
            x=2*ks/pi*(asin(e0/A)+e0/A*sqrt(1-(e0/A)^2));
            y=0;
            plot(-1/x,y,'m');
            hold on
        end
        num=[K];den=conv(conv([1 0],[T1 1]),[T2 1]);  
        G=tf(num,den);
        w1=1.8:0.1:20;
        nyquist(G,w1);hold off;        
        %A w
        syms h
        w=1/sqrt(T1*T2);
        Gn=K/(j*w*(T1*j*w+1)*(j*w*T2+1));
        U=real(Gn);
        U=vpa(U,4);
        h1=-1/(2*ks/pi*(asin(e0/h)+e0/h*sqrt(1-(e0/h)^2)))-U;
        [h]=solve(h1,h);
end
ping1=num2str(w);z=subs(h);
set(findobj('tag','edit11'),'string',ping1);
set(findobj('tag','edit12'),'string',z);
就是不对啊
发表于 2007-4-8 18:05 | 显示全部楼层
原帖由 jennychung 于 2007-4-8 18:01 发表
我不用GUI运行
就在matlab里运行如下代码的话是对的

syms w w1 x y A U Gn h1 h;
K=input('K=')
T1=input('T1=')
T2=input('T2=')
k=2;e0=1;  %gai
for A=1.1:0.1:20;
    x=2*k/pi*(asin(e0/A)+e0/A ...



你还是老老实实地在GUI中该函数的第一个语句设置断点,看看出什么问题了吧。我猜你运行的时候没有运行case 1里面的代码
 楼主| 发表于 2007-4-8 18:10 | 显示全部楼层
应该运行了case 1啊
因为正确显示了w的值啊.
就是不显示h的值,老是报错
??? Error using ==> set
Conversion to double from sym is not possible.

Error in ==> feixianxing>pushbutton3_Callback at 608
set(findobj('tag','edit12'),'string',z);

Error in ==> gui_mainfcn at 75
        feval(varargin{:});

Error in ==> feixianxing at 42
    gui_mainfcn(gui_State, varargin{:});

??? Error while evaluating uicontrol Callback.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-12 20:30 , Processed in 0.057575 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表