24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1016  |  回复: 14
当前主题已经存档。
本帖产生 1 个 仿真EPI ,点击这里进行查看

feibao

银虫 (小有名气)

[交流] 【求助】MATLAB程序出错求助已有5人参与

请高手指教 多谢  下面这个程序在MATLAB7.0版本中运行时总是出现如下问题:

??? Error using ==> minus
Out of memory. Type HELP MEMORY for your options.

Error in ==> sym.sym>char2sym at 395
         p = cumsum((S == '(') - (S == ')'));

Error in ==> sym.sym at 92
   S = char2sym(x);

Error in ==> sym.maple at 92
   result = sym(result);

Error in ==> sym.diff at 50
   R = reshape(maple('map','diff',S(,x),size(S));

但在MATLAB7.10版本中没有显示出错,却一直不出结果  不知怎么回事 请帮忙了


clear all
>> clear all
format short
syms u  v
m=1;
s=1+0.1;
a=0.98;
b=0.99;
n1=1.48;
n2=-a*n1;
n3=b*n1;
r=(n1^2-n2^2)/(n1^2-n3^2)
w1=v^2*r-u^2;
w=v^2-u^2;
ne=sqrt((w^2/v^2)*(n1^2-n3^2)+n3^2);
F1=-besselj(m+1,u)+m./u.*besselj(m,u);
F=F1./(u.*besselj(m,u));
M1=besseli(m+1,w1)+m./w1.*besseli(m,w1);
M=M1./(w1.*besseli(m,w1));
N1=-besselk(m+1,w1)+m./w1.*besselk(m,w1);

N=N1./(w1.*besselk(m,w1));
Q=m*(1./u.^2+1./w1.^2);
R=m*(1./w1.^2-1./w.^2)/s;
S1=besseli(m+1,w1*s)+m./w1./s.*besseli(m,w1*s);

S=S1./(w1.*besseli(m,w1*s));
T1=-besselk(m+1,w*s)+m./w./s.*besselk(m,w*s);

T=T1./(w.*besselk(m,w*s));
X1=-besselk(m+1,w1*s)+m./w1./s.*besselk(m,w1*s);

X=X1./(w1.*besselk(m,w1*s));
I1m=besseli(m,w1);
K1m=besselk(m,w1);
I2m=besseli(m,w1*s);
K2m=besselk(m,w1*s);
x1=Q.*ne.*I1m
x2=Q.*ne.*K1m;
x3=I1m.*(F-M);
x4=K1m.*(F-N);
x5=R*ne.*I2m;
x6=R.*ne.*K2m;
x7=I2m.*(-S-T);
x8=K2m.*(-X-T);
x9=I1m.*(n1^2.*F-n2^2.*M);
x10=K1m.*(n1^2.*F-n2^2.*N);
x11=Q.*ne.*I1m;
x12=Q.*ne.*K1m;
x13=I2m.*(-S.*n2^2-n3^2.*T);
x14=K2m.*(-n2^2.*X-n3^2.*T);
x15=R.*ne.*I2m;
x16=R.*ne.*K2m;
f=det([x1,x2,x3,x4;x5,x6,x7,x8;x9,x10,x11,x12;x13,x14,x15,x16]);
fv=diff(f,v);
fu=diff(f,u);
f1=-fv/fu;
f2=1+(u/v)^2*(1-2*v/u*f1);
Q=load('e:\0.1.txt');
for i=1:length(Q(:,1));
v=Q(i,1);
u=Q(i,3)
f22=eval(f2)              
f11=eval(f1)
hold on
plot(v,f11,f22)
end
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lingwei004

金虫 (小有名气)

feibao(金币+1): 2010-04-18 12:12
数据太大了吧。你0.1.txt里面有多少个数据?估计是这个地方问题
2楼2010-04-15 16:59:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

feibao

银虫 (小有名气)

引用回帖:
Originally posted by lingwei004 at 2010-04-15 16:59:47:
数据太大了吧。你0.1.txt里面有多少个数据?估计是这个地方问题

大约100多个数据。我若取其中一个数据赋值v=7.9842590e-001   u= 7.7820931e-001 仍然不起作用  谢谢 请帮忙指点指点
3楼2010-04-15 17:20:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

anyuezhiji

银虫 (正式写手)

星空行者

feibao(金币+5): 2010-04-18 12:13
Out of memory. Type HELP MEMORY for your options

内存不足
引用回帖:
Matlab 中数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候,”Out of Memory” 就会出现。由于反复分配和释放数组会使可用的连续内存段减少,因此当 Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组,这一点可以用命令 feature(’memstats’)(在 7.0 版本以上)看出。如果现实的最大连续内存段很小,但实际可用内存(非连续的)仍旧很多,则表明内存中碎片太多了。此时可以考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘,然后重新建立这些数组,以减少内存碎片。此外,在命令行或者程序中都可以使用 clear 命令,随时减少不必要的内存。

你用diff对符号函数微分时可能占很大的内存 而你的内存已经无法为新建的数组分配连续的内存段
建议符号函数计算出结果简化下
尤其在用diff算微分前最好先把f简化下 如f=simple(f)
另外释放掉一些已经可以不用的变量 如 clear x1 x2

引用回帖:
out of Memory问题处理方法一般如下:

1. 增加虚拟内存
2. 采用PACK
3. 条件允许的话采用64位系统
4. 采用3GB switch,增加虚拟内存
5. 优化程序,减少变量
6. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动
7. 关闭Matlab Server

[ Last edited by anyuezhiji on 2010-4-15 at 20:08 ]
暗月下没有留下风的痕迹,但它已经寂然飘逝。。By<暗月之寂>:tiger38:
4楼2010-04-15 19:14:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

anyuezhiji

银虫 (正式写手)

星空行者

feibao(金币+2): 2010-04-18 12:13
测试了下

上面的代码在用diff算微分前
f的表达式的长度为927553字节

MATLAB的表达式非汉字 一个字节就对应一个字符
f的表达式长度就有92万多字符

暗月下没有留下风的痕迹,但它已经寂然飘逝。。By<暗月之寂>:tiger38:
5楼2010-04-15 19:36:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

feibao

银虫 (小有名气)

非常感谢你 帮俺看看程序是否还有其他方面的问题 ?可以给u  v 赋值如楼上数据  解决了加金重谢。
6楼2010-04-15 19:39:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

fspdlh

金虫 (正式写手)

feibao(金币+1): 2010-04-18 12:14
还有个办法,就是把用不着的变量及时从内存在中删除
clear 变量名
7楼2010-04-16 11:30:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

feibao

银虫 (小有名气)

引用回帖:
Originally posted by fspdlh at 2010-04-16 11:30:03:
还有个办法,就是把用不着的变量及时从内存在中删除
clear 变量名

谢谢你啊  现在的最大问题是给程序赋值后 一直不出结果?????????,这个也是内存不足的问题??先按楼上的u  v 值   帮俺考虑一下怎样才出结果,谢谢
8楼2010-04-16 11:40:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

anyuezhiji

银虫 (正式写手)

星空行者

feibao(金币+5): 2010-04-18 12:15
feibao(金币+5):非常谢谢谢谢 2010-04-21 13:58
引用回帖:
Originally posted by feibao at 2010-04-16 11:40:41:



谢谢你啊  现在的最大问题是给程序赋值后 一直不出结果?????????,这个也是内存不足的问题??先按楼上的u  v 值   帮俺考虑一下怎样才出结果,谢谢

不是总内存不足
而是f太大了 你可以把f的表达式保存成文本文件测试下

求导时单个变量所占内存太大 建议拆开来算:
引用回帖:
clear all
format short
syms u  v

m=1;
s=1+0.1;
a=0.98;
b=0.99;
n1=1.48;
n2=-a*n1;
n3=b*n1;
r=(n1^2-n2^2)/(n1^2-n3^2);

w1=v^2*r-u^2;
w=v^2-u^2;
ne=sqrt((w^2/v^2)*(n1^2-n3^2)+n3^2);
F1=-besselj(m+1,u)+m./u.*besselj(m,u);
F=F1./(u.*besselj(m,u));
M1=besseli(m+1,w1)+m./w1.*besseli(m,w1);
M=M1./(w1.*besseli(m,w1));
N1=-besselk(m+1,w1)+m./w1.*besselk(m,w1);

N=N1./(w1.*besselk(m,w1));
Q=m*(1./u.^2+1./w1.^2);
R=m*(1./w1.^2-1./w.^2)/s;
S1=besseli(m+1,w1*s)+m./w1./s.*besseli(m,w1*s);

S=S1./(w1.*besseli(m,w1*s));
T1=-besselk(m+1,w*s)+m./w./s.*besselk(m,w*s);
T=T1./(w.*besselk(m,w*s));
X1=-besselk(m+1,w1*s)+m./w1./s.*besselk(m,w1*s);

X=X1./(w1.*besselk(m,w1*s));
I1m=besseli(m,w1);
K1m=besselk(m,w1);
I2m=besseli(m,w1*s);
K2m=besselk(m,w1*s);
x1=Q.*ne.*I1m;
x2=Q.*ne.*K1m;
x3=I1m.*(F-M);
x4=K1m.*(F-N);
x5=R*ne.*I2m;
x6=R.*ne.*K2m;
x7=I2m.*(-S-T);
x8=K2m.*(-X-T);
x9=I1m.*(n1^2.*F-n2^2.*M);
x10=K1m.*(n1^2.*F-n2^2.*N);
x11=Q.*ne.*I1m;
x12=Q.*ne.*K1m;
x13=I2m.*(-S.*n2^2-n3^2.*T);
x14=K2m.*(-n2^2.*X-n3^2.*T);
x15=R.*ne.*I2m;
x16=R.*ne.*K2m;
% f=det([x1,x2,x3,x4;
%        x5,x6,x7,x8;
%        x9,x10,x11,x12;
%        x13,x14,x15,x16]);


%%PSL@CSU
%%QQ:547423688
%%Email:anyuezhiji@qq.com
%%Edit @ 2010.4.17


%拆开算  
detf1=x1*x6*x11*x16;
detf2=-x1*x6*x12*x15;
detf3=-x1*x10*x7*x16;
detf4=x1*x10*x8*x15;
detf5=x1*x14*x7*x12;
detf6=-x1*x14*x8*x11;
detf7=-x5*x2*x11*x16;
detf8=x5*x2*x12*x15;
detf9=x5*x10*x3*x16;
detf10=-x5*x10*x4*x15;
detf11=-x5*x14*x3*x12;
detf12=x5*x14*x4*x11;
detf13=x9*x2*x7*x16;
detf14=-x9*x2*x8*x15;
detf15=-x9*x6*x3*x16;
detf16=x9*x6*x4*x15;
detf17=x9*x14*x3*x8;
detf18=-x9*x14*x4*x7;
detf19=-x13*x2*x7*x12;
detf20=x13*x2*x8*x11;
detf21=x13*x6*x3*x12;
detf22=-x13*x6*x4*x11;
detf23=-x13*x10*x3*x8;
detf24=x13*x10*x4*x7;


for i=1:24
eval(['fv',num2str(i),'=diff(detf',num2str(i),',v);']);
end
for i=1:24
eval(['fu',num2str(i),'=diff(detf',num2str(i),',u);']);
end

%这里开始读入数据
v=7.9842590e-001;
u=7.7820931e-001;
%下面开始求值
ffv=0;
for i=1:24
    eval(['ffv=ffv+eval(fv',num2str(i),');'])
end

ffu=0;
for i=1:24
    eval(['ffu=ffu+eval(fu',num2str(i),');'])
end

ff1=-ffv/ffu
ff2=1+(u/v)^2*(1-2*v/u*ff1)

引用回帖:
ff1 =

    1.0661


ff2 =

   -0.1282

但是你用了besseli等函数 不知道这样拆开把各项求导再相加是不是有误
如果有误的话 参考这一思路 把它拆成正确的项相加



祝君好运!!

[ Last edited by anyuezhiji on 2010-4-17 at 00:33 ]
暗月下没有留下风的痕迹,但它已经寂然飘逝。。By<暗月之寂>:tiger38:
9楼2010-04-17 00:27:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

anyuezhiji

银虫 (正式写手)

星空行者

feibao(金币+1): 2010-04-18 12:15
用下面的代码测试了下
引用回帖:
f=det([x1,x2;
        x3,x4;]);
fu=diff(f,u)
fu2=diff(x1*x4,u)+diff(-x2*x3,u)
v=7.9842590e-001;
u=7.7820931e-001;
eval(fu)
eval(fu2)

分开算再相加直接求导得出的结果是一样的
暗月下没有留下风的痕迹,但它已经寂然飘逝。。By<暗月之寂>:tiger38:
10楼2010-04-17 13:32:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 feibao 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见