24小时热门版块排行榜    

查看: 2389  |  回复: 5

kittyzoe

木虫 (正式写手)

[求助] matlab 计算过程中工作空间变量保存及读取 求解决内存不足的方法

利用matlab ode45函数求解常微分方程的过程中, 由于计算步长较小,计算时刻较多,每时刻均需要保存数据,最后还没能到计算结束已经导致内存溢出。
     利用save命令将所有变量保存到硬盘,clear内存中的变量,然后再利用load命令将所需变量读取。但load读取的是保存已计算的所有时刻的变量,使计算变慢,其实此时只想读取前一时刻的变量,不知使用load命令是否能实现呢?
     或者高手们是否有解决由于保存数据较多导致内存溢出的更好的办法呢?
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dbb627

荣誉版主 (著名写手)

【答案】应助回帖

kittyzoe(金币+5): 2011-11-11 16:19:45
首先我觉得是不是不用算那没多步,如果ode45收敛性差,方程刚性的话,可采用ode15s
此外如果确实需要算很多步
下面的方法可能会有用
     使用xlswrite 或者fprintf 将数据写到text或者excel文件中
    使用PACK:PACK可以将matlab中的变量导出到磁盘中,以增加可用内存。

     减少变量的内存开销:清除工作间不必要的变量。  
    64位架构:采用64位的软硬件架构,目前实验室条件下不可行。
    3GB切换(3GB switch):由于在windows上运行matlab时,如果内存的使用超过约1.7G左右就要出现这种错误,而无论你有多大的内存也没用。幸好现在在Windows XP上,MATLAB现在支持3GB切换(3GB switch)启动选项(boot option),配置额外的1GB的可寻址内存到每个程序上。这增加了你可以储存到MATLAB workspace中资料的总量约到2.7 GB。这相当于33亿的精度值。此新增的内存区块和MATLAB使用剩下的(内存)并不是连续的,所以你不能建立一个数组来填满此空间。

     具体做法:修改C:\ Boot.ini文件如下

    [boot loader]

    timeout=30SimWe个人空间

    default=multi(0)disk(0)rdisk(0)partition(2)\WINNT

     [operating systems]

    multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB

    注意后面的/3GB就是后加上的。重新启动系统再次运行matlab。
The more you learn, the more you know, the more you know, and the more you forget. The more you forget, the less you know. So why bother to learn.
2楼2011-11-11 15:36:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kittyzoe

木虫 (正式写手)

引用回帖:
2楼: Originally posted by dbb627 at 2011-11-11 15:36:56:
首先我觉得是不是不用算那没多步,如果ode45收敛性差,方程刚性的话,可采用ode15s
此外如果确实需要算很多步
下面的方法可能会有用
     使用xlswrite 或者fprintf 将数据写到text或者excel文件中
    使用P ...

我尝试使用ode15s,出现以下错误:
Warning: Failure at t=1.166017e-003.  Unable to meet integration tolerances without reducing the step size below
the smallest value allowed (3.469447e-018) at time t.
> In ode15s at 753
这种情况应该怎么办呢?是计算不收敛么?该怎么解决呢?
有时候赋予某个特定初值时用ode45就可以很快算出结果,而且现在ode45虽然算的很慢,但是至今除了因为内存不足以外,还没开始报错,所以打算长时间算算看,不知道行不行。
3楼2011-11-11 16:13:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kittyzoe

木虫 (正式写手)

内存不足的问题我已经通过存盘的方式解决,
利用save 和load命令确实好用,在计算过程中内存节省不少
然后需要保存的变量直接fprintf到txt文件里保存了。

fid=fopen('data.txt','a+');
fprintf(fid,'%16.8e   %16.8e  %16.8e    %16.8e    %16.8e\r\n',t,Y);
fclose(fid);
save matlab.mat
clear
load matlab.mat t Y DY

这样save的是计算时刻的变量,load出来的是上一时刻需要的工作变量,继续进行计算
4楼2011-11-11 16:18:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dbb627

荣誉版主 (著名写手)

【答案】应助回帖

可能边界条件定义不合适,就是初值定义不合适,能把方程贴出来看看吗。
The more you learn, the more you know, the more you know, and the more you forget. The more you forget, the less you know. So why bother to learn.
5楼2011-11-11 16:19:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kittyzoe

木虫 (正式写手)

引用回帖:
5楼: Originally posted by dbb627 at 2011-11-11 16:19:26:
可能边界条件定义不合适,就是初值定义不合适,能把方程贴出来看看吗。

好,方程中初值我是这么设置的:
x0=[a;0;b;0]

当设置初值a=b的时候非常容易就计算出结果,但是只要设置a与b不相等时,算了很久很久,也没出结果,计算到某一时刻以后步长越来越小,一直在迭代。。。。
很崩溃啊
其中pex(t)是随时间变化的量。


6楼2011-11-14 09:05:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 kittyzoe 的主题更新
信息提示
请填处理意见