声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6153|回复: 17

[编程技巧] 【已解决】计算过程中整数太大

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

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

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

x
急!
在计算过程中出现如下错误提示:
-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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-8-31 14:47 | 显示全部楼层
是特意定义为整数吗?定义为浮点数表示的范围要大得多。
 楼主| 发表于 2006-8-31 15:14 | 显示全部楼层
谢谢realhappy!
没有特意定义为整数啊。用whos查看两个系数分别为double array和single array。
发表于 2006-8-31 16:04 | 显示全部楼层
用函数强制把他转换成浮点数,可不可以呢。
 楼主| 发表于 2006-8-31 17:10 | 显示全部楼层
这个函数我还不知道。。。。请赐教!
发表于 2006-8-31 17:59 | 显示全部楼层
可以改perferences里的数据类型吧,或者用format 命令

评分

1

查看全部评分

发表于 2006-9-1 02:25 | 显示全部楼层
感觉以上各位的说法可能未必准确。
可以用dbstep追踪一下相关变量在出错前的具体数值是多少,明显楼主的程序主计算部分用了符号计算,sym变量的数字大小一般是很大的,不像浮点双精度类型数据只显示16位,更不会没事儿就离谱到让计算机都受不了,所以认为主程序本身出问题的可能性更大。至于把这种数据转换成浮点格式是很简单的事情:
  1. >>a=sym('-6020095/1152921504606846976*k2+12045263/2305843009213693952*k3');
  2. >> digits(18)
  3. >> vpa(a)
  4. ans =
  5. -.522160006205529825e-11*k2+.522380012510370584e-11*k3
复制代码

无论“format ...”还是在preference中修改的做法(实际是一回事儿)对sym类型数据应当不对症。

评分

1

查看全部评分

 楼主| 发表于 2006-9-1 11:52 | 显示全部楼层
感谢bainhome、skysurfer!我仔细查了查,根本就是sym变量在搞鬼!
有sym变量时怎么转换类型也不行,至于为什么我还不知道。(主程序暂没发现问题)
我先用bainhome的CODE试试吧。
 楼主| 发表于 2006-9-5 16:12 | 显示全部楼层

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

过了这么多天,结果让大家失望了:
还是提示整数过大:(
下面是解方程的子程序:
%方程的求解过程:(求P的未知参数k1 k2 k3)
function [y1,y2,y3]=solveequ0901(At,F)
%At、F为从主程序传到该子程的已知数。
N=6;L=7;h=10;
syms k1 k2 k3
P=[k1;k2;k3;0.0001737*k1;0.0001737*k2;0.0001737*k3;1.0926529];
%=================================================
%解方程:∑[F-∑(As*P)*Aq]=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
[k1,k2,k3]=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个月了!救救我吧!
 楼主| 发表于 2006-9-6 12:26 | 显示全部楼层
有人在看吗?
发表于 2006-9-6 14:43 | 显示全部楼层
这个问题以前给过解决办法

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

[ 本帖最后由 eight 于 2007-1-25 12:22 编辑 ]
 楼主| 发表于 2006-9-6 15:37 | 显示全部楼层
看了,我再试试。谢谢happy教授!
(他那个贴子标题与内容不符啊,所以我没注意到。。。)
 楼主| 发表于 2006-9-11 10:01 | 显示全部楼层
终于解决了!!感谢happy教授!感谢bainhome、realhappy、skysurfer、suffer!
就用clear maplemex
(另外还发现应该把clear maplemex放在主程序中,放在子程序中循环调用特占内存!调用500次就需要将虚拟内存页面文件调整到2000M!!机子受不了了。。。)

评分

1

查看全部评分

发表于 2008-12-12 12:35 | 显示全部楼层
原帖由 realyyy 于 2006-9-11 10:01 发表
(另外还发现应该把clear maplemex放在主程序中,放在子程序中循环调用特占内存!调用500次就需要将虚拟内存页面文件调 ...


比如我主程序的开头是
clear all;
clc;
我可以把clear maplemex这样放
clear all;
clear maplemes;
clc;
楼主是这个意思吗?恳请指点
发表于 2008-12-12 15:51 | 显示全部楼层

回复 14楼 Johnwen 的帖子

你可以试试
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-15 21:59 , Processed in 0.077024 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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