realyyy 发表于 2006-8-31 14:03

【已解决】计算过程中整数太大

急!
在计算过程中出现如下错误提示:
-6020095/1152921504606846976*k2+12045263/2305843009213693952*k3
??? Error using ==> sym.maple
Error, integer too large in context
>>
我的计算是个迭代循环,根据己知系数求k2、k3的值,当循环到130次时出现上述错误提示。
我不明白MATLAB为啥要用-6020095/1152921504606846976和12045263/2305843009213693952作为系数进行运算而不用-5.2216e-012和5.2238e-012?有什么方法能让它自动化简吗?
高手快指点指点!急啊!
谢谢了!

[ 本帖最后由 eight 于 2007-1-25 12:25 编辑 ]

realhappy 发表于 2006-8-31 14:47

是特意定义为整数吗?定义为浮点数表示的范围要大得多。

realyyy 发表于 2006-8-31 15:14

谢谢realhappy!
没有特意定义为整数啊。用whos查看两个系数分别为double array和single array。

realhappy 发表于 2006-8-31 16:04

用函数强制把他转换成浮点数,可不可以呢。

realyyy 发表于 2006-8-31 17:10

这个函数我还不知道。。。。请赐教!

skysurfer 发表于 2006-8-31 17:59

可以改perferences里的数据类型吧,或者用format 命令

bainhome 发表于 2006-9-1 02:25

感觉以上各位的说法可能未必准确。
可以用dbstep追踪一下相关变量在出错前的具体数值是多少,明显楼主的程序主计算部分用了符号计算,sym变量的数字大小一般是很大的,不像浮点双精度类型数据只显示16位,更不会没事儿就离谱到让计算机都受不了,所以认为主程序本身出问题的可能性更大。至于把这种数据转换成浮点格式是很简单的事情:
>>a=sym('-6020095/1152921504606846976*k2+12045263/2305843009213693952*k3');
>> digits(18)
>> vpa(a)
ans =
-.522160006205529825e-11*k2+.522380012510370584e-11*k3
无论“format ...”还是在preference中修改的做法(实际是一回事儿)对sym类型数据应当不对症。

realyyy 发表于 2006-9-1 11:52

感谢bainhome、skysurfer!我仔细查了查,根本就是sym变量在搞鬼!
有sym变量时怎么转换类型也不行,至于为什么我还不知道。(主程序暂没发现问题)
我先用bainhome的CODE试试吧。

realyyy 发表于 2006-9-5 16:12

哎呀呀!还是提示整数过大啊!

过了这么多天,结果让大家失望了:
还是提示整数过大:(
下面是解方程的子程序:
%方程的求解过程:(求P的未知参数k1 k2 k3)
function =solveequ0901(At,F)
%At、F为从主程序传到该子程的已知数。
N=6;L=7;h=10;
syms k1 k2 k3
P=;
%=================================================
%解方程:∑=0
for q=1:3
    sff2=0;
    for r=1:h*N
      sff1=0;
            for s=1:L
            sff1=vpa(sff1+vpa(At(r,s)*P(s),4),4);
            %sff1=vpa(sff1,4);%这个vpa到底应该设在哪里呢?
            end
      sff2=vpa(sff2+vpa((F(r)-sff1)*At(r,q),4),4);
      %sff2=vpa(sff2,4);
    end
    equ5x(q)=sff2;
end
=solve(equ5x(1),equ5x(2),equ5x(3),'k1','k2','k3');
k1=single(vpa(k1,4));k2=single(vpa(k2,4));k3=single(vpa(k3,4));
P=subs(P,'k1',k1);P=subs(P,'k2',k2);P=subs(P,'k3',k3);
P=single(P);
%==================下面是函数返回值=======================
y1=single(k1);
y2=single(k2);
y3=single(k3);
%我还有一个主程序是调用这个解方程程序的,
%在主程序中也设置了循环调用次数以控制收敛,并为这个解方程的程序提供At、F,
%注意每次从主程序传到该子程时的F都是经过修正的!在主程序中有一句F=k1+a*k2对F进行修正
%另:主程序根据两次调用子程序计算后的k1、k2、k3的差值来控制收敛。
%我昨天主程序循环1000次,正常;今天调整成2000次,结果在第1058次时提示整数过大。
%我都快折腾1个月了!救救我吧!

realyyy 发表于 2006-9-6 12:26

有人在看吗?

happy 发表于 2006-9-6 14:43

这个问题以前给过解决办法

看帖子http://forum.vibunion.com/forum/viewthread.php?tid=5436

[ 本帖最后由 eight 于 2007-1-25 12:22 编辑 ]

realyyy 发表于 2006-9-6 15:37

看了,我再试试。谢谢happy教授!
(他那个贴子标题与内容不符啊,所以我没注意到。。。)

realyyy 发表于 2006-9-11 10:01

终于解决了!!感谢happy教授!感谢bainhome、realhappy、skysurfer、suffer!
就用clear maplemex
(另外还发现应该把clear maplemex放在主程序中,放在子程序中循环调用特占内存!调用500次就需要将虚拟内存页面文件调整到2000M!!机子受不了了。。。)

Johnwen 发表于 2008-12-12 12:35

原帖由 realyyy 于 2006-9-11 10:01 发表 http://www.chinavib.com/forum/images/common/back.gif
(另外还发现应该把clear maplemex放在主程序中,放在子程序中循环调用特占内存!调用500次就需要将虚拟内存页面文件调 ...

比如我主程序的开头是
clear all;
clc;
我可以把clear maplemex这样放
clear all;
clear maplemes;
clc;
楼主是这个意思吗?恳请指点

sigma665 发表于 2008-12-12 15:51

回复 14楼 Johnwen 的帖子

你可以试试
页: [1] 2
查看完整版本: 【已解决】计算过程中整数太大