声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2512|回复: 20

[编程技巧] 新手向您请教一简单问题,谢谢!

[复制链接]
发表于 2009-2-11 18:24 | 显示全部楼层 |阅读模式

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

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

x
文本文档1.txt为(7列12行):
0.19 0.07 0.74 0.600957 1.5593 0.4159 13.18293872
0.19 0.07 0.74 0.61483   1.5644 0.3932 13.18977909
0.19 0.07 0.74 0.563157 1.5672 0.3764 13.18983356
0.19 0.07 0.74 0.580532 1.5627 0.3819 13.1967284
0.19 0.07 0.74 0.572817 1.5485 0.385 13.19683803
0.19 0.07 0.74 0.574459 1.5437 0.3827 13.19683803
0.19 0.07 0.74 0.558511 1.5324 0.4194 13.21719435
0.19 0.07 0.74 0.637349 1.5381 0.4576 13.21719435
0.19 0.07 0.74 0.617176 1.5593 0.4545 13.21057324
0.19 0.07 0.74 0.634689 1.5526 0.4435 13.21057324
0.19 0.07 0.74 0.532446 1.5526 0.4141 13.23120398
0.19 0.07 0.74 0.517933 1.5567 0.3781 13.23120398

我要将文本文件1.txt每行的数值赋值给7个变量,将这些变量带入方程后,解关于Sh的一个一元多次方程,最后返回计算出的Sh结果,应该得到一个一维列向量。我试着将第一行的数值赋值给7个变量后计算Sh,但由于初学,总调试不正确。由于工作紧迫,特向您请教我的错误该如何更正?另外,要使每行都计算出一个Sh,是否将程序中第二行变为i=1:12?感谢您的赐教!谢谢!

我写的程序为:
f=load('1.txt');
i=1;
c1=f(i,1);c2=f(i,2);c3=f(i,3);o=f(i,4);Vp=f(i,5);Vs=f(i,6);p=f(i,7);
Km=0.5*(c1*36.6+c2*76+c3*6.85+(c1/36.6+c2/76+c3/6.85)^(-1));
Um=0.5*(c1*45+c2*26+c3*20.9+(c1/45+c2/26+c3/20.9)^(-1));
a=sqrt(Um/(Km+4/3*Um));
G=0.9552+0.0448*exp(-c3/0.06714);
m=1;
n=10^(0.426-0.235*log10(p))/m;
sym Sh;
y=Vp*(G*a*(1-o)^n+sqrt(3.3*Sh/(((1-Sh)/2.29+Sh/7.9)^(-1)+4/3*3.3*Sh))*o*Sh)-Vs;
Sh=solve(y,Sh)

显示错误是:
??? Error using ==> sym.mpower
Matrix must be square.

我用的matlab 7.0版本。

感激不尽!
回复
分享到:

使用道具 举报

发表于 2009-2-11 18:30 | 显示全部楼层
你最好逐行运行,这样才知道哪一行出问题,目前看来是乘有问题,不是方阵
另外,请搜索下精华帖关于文件读取,里面有很详细说明
 楼主| 发表于 2009-2-11 18:44 | 显示全部楼层
谢谢sigma665老师,我逐行试了一下,是在倒数第二行时出错。请教一下该如何改正?谢谢!
发表于 2009-2-11 21:56 | 显示全部楼层
...
显示错误是:
??? Error using ==> sym.mpower
Matrix must be square. ...


我报错怎不同, 楼主是否搞乱了!
??? Undefined function or variable 'Sh'.

试试将sym Sh改为syms Sh
 楼主| 发表于 2009-2-12 09:25 | 显示全部楼层
sorry,是搞乱了,报错为??? Undefined function or variable 'Sh'

我将sym改为syms Sh后,运行得到的是一个表达式,而不是一个数值啊,请问是怎么回事?该怎么改正呢?

谢谢!
发表于 2009-2-12 09:27 | 显示全部楼层

回复 5楼 airhoo1 的帖子

4F不是给了建议了!
 楼主| 发表于 2009-2-12 12:52 | 显示全部楼层
谢谢各位的回答,我在最后加了一行subs(Sh)后已能计算出数值
f=load('1.txt');
i=1;
c1=f(i,1);c2=f(i,2);c3=f(i,3);o=f(i,4);Vp=f(i,5);Vs=f(i,6);p=f(i,7);
Km=0.5*(c1*36.6+c2*76+c3*6.85+(c1/36.6+c2/76+c3/6.85)^(-1));
Um=0.5*(c1*45+c2*26+c3*20.9+(c1/45+c2/26+c3/20.9)^(-1));
a=sqrt(Um/(Km+4/3*Um));
G=0.9552+0.0448*exp(-c3/0.06714);
m=1;
n=10^(0.426-0.235*log10(p))/m;
Sh=sym('Sh');
y=Vp*(G*a*(1-o)^n+sqrt(3.3*Sh/(((1-Sh)/2.29+Sh/7.9)^(-1)+4/3*3.3*Sh))*o*Sh)-Vs;
Sh=solve(y,Sh);
subs(Sh)

现在我想计算1.txt中1到12行所有的Sh,将第2行改为i=1:12;后出错??? Error using ==> mpower
Matrix must be square.,请问如何实现这个循环呢?谢谢!
发表于 2009-2-12 13:18 | 显示全部楼层
f=load('1.txt');
for i=1:12
c1=f(i,1);c2=f(i,2);c3=f(i,3);o=f(i,4);Vp=f(i,5);Vs=f(i,6);p=f(i,7);
Km=0.5*(c1*36.6+c2*76+c3*6.85+(c1/36.6+c2/76+c3/6.85)^(-1));
Um=0.5*(c1*45+c2*26+c3*20.9+(c1/45+c2/26+c3/20.9)^(-1));
a=sqrt(Um/(Km+4/3*Um));
G=0.9552+0.0448*exp(-c3/0.06714);
m=1;
n=10^(0.426-0.235*log10(p))/m;
syms Sh;
y=Vp*(G*a*(1-o)^n+sqrt(3.3*Sh/(((1-Sh)/2.29+Sh/7.9)^(-1)+4/3*3.3*Sh))*o*Sh)-Vs;
Sh=solve(y,Sh);
subs(Sh)
end

[ 本帖最后由 ChaChing 于 2009-2-12 13:24 编辑 ]
 楼主| 发表于 2009-2-12 16:38 | 显示全部楼层
非常感谢!得出了计算结果
ans =
    1.4014
    0.2876
ans =
    0.2657
    1.4027
ans =
    0.1404
    1.4072 ...

12行,每行得出Sh有2个解。我还想请教一下如何使计算结果显示为一个2列12行的数据表,因为我真正计算时有一千多行,如果人工整理上面这种形式的计算结果太费时间了。麻烦了!谢谢!

[ 本帖最后由 ChaChing 于 2009-2-12 20:37 编辑 ]
 楼主| 发表于 2009-2-12 20:05 | 显示全部楼层
我的意思是使输出的结果变成两列,例如上面的结果变为下列形式:
ans=
1.4014 0.2876
1.4027 0.2657
1.4072 0.1404
1.4059 0.1890
1.4060 0.1876
1.4060 0.1885
1.4040 0.2380
1.3908 0.4146
1.3947 0.3757
1.3941 0.3814

谢谢您的帮助!
发表于 2009-2-12 20:35 | 显示全部楼层
n=size(f,1); TolSh=zeros(n,2);
for i=1:n
c1=f(i,1);c2=f(i,2);c3=f(i,3);o=f(i,4);Vp=f(i,5);Vs=f(i,6);p=f(i,7); Km=0.5*(c1*36.6+c2*76+c3*6.85+(c1/36.6+c2/76+c3/6.85)^(-1));
Um=0.5*(c1*45+c2*26+c3*20.9+(c1/45+c2/26+c3/20.9)^(-1)); a=sqrt(Um/(Km+4/3*Um)); G=0.9552+0.0448*exp(-c3/0.06714);
m=1; n=10^(0.426-0.235*log10(p))/m; syms Sh; y=Vp*(G*a*(1-o)^n+sqrt(3.3*Sh/(((1-Sh)/2.29+Sh/7.9)^(-1)+4/3*3.3*Sh))*o*Sh)-Vs;
Sh=solve(y,Sh); TolSh(i,:)=subs(Sh)';
end
TolSh

评分

1

查看全部评分

 楼主| 发表于 2009-2-13 10:03 | 显示全部楼层
谢谢ChaChing!可能有一些无解,运行后出现错误:
Warning: Explicit solution could not be found.
> In solve at 140
  In sym.solve at 49
??? Function 'eval' is not defined for values of class 'double'.

Error in ==> eval at 44
  [varargout{1:nargout}] = builtin('eval', varargin{:});

Error in ==> sym.double at 45
D = reshape(eval(X),siz);

Error in ==> sym.subs at 66
if isempty(vars), NEWf = double(OLDf); return, end
请问该如何解决呢?谢谢!
发表于 2009-2-13 10:18 | 显示全部楼层
symbolic这块个人以前根本不会!
我是执行网友的程序, 边看Help, 边学习的!
LZ这样的讯息我就没经验了! 除非我可以试!
或等有经验的人出现! sorry!

刚刚才看到LZ数据! 有空会试试看!

[ 本帖最后由 ChaChing 于 2009-2-13 10:36 编辑 ]
 楼主| 发表于 2009-2-13 10:26 | 显示全部楼层
:lol 还是感谢你!其实我也应该像你边执行边看help学习,可惜是初接触matlab,没基础,加上现在急需得出结果,所以一步步程序的实现都麻烦大家了。我自己也在摸索着,以后还要向大家多多学习!再次感谢你,并期待着能解决这个问题的人出现,感谢大家的帮助!
 楼主| 发表于 2009-2-13 10:29 | 显示全部楼层
另外,我把程序中的文件1.txt发短消息给你了,也期待着你能攻克这个问题,我现在也在试着。麻烦你了!Thanks!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-17 12:52 , Processed in 0.067438 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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