ppjj 发表于 2007-6-11 17:39

BASIC程序求助

我准备做一个灰色系统的GM(1,N)程序.找到一个用GWBASIC的,但是运行错误,求高手帮忙修改一下!!!谢谢!!!!!源程序如下:

10REM****************************************************
20REM*       ****灰色状态方程计算程序*****            *
30REM*               程序名:GM(1,N)                  *
40REM****************************************************
100   CLS:PRINT"********GM(1,N)*********"
110 DIM Y(10,60):GOSUB 5000
120 OPEN"i",#1,WJ$
130 INPUT #1,GS,T0,TN
140 MN=TN-T0+1
150 FOR I=1 TO GS
160 INPUT #1,MC$(I)
170 FOR J=1 TO MN
180 INPUT #1,Z(I,J)
190 NEXT:NEXT
200 CLOSE
210 PRINT:PRINT"指标数:";GS,"起止时序";T0,"中止时序";TN
220 PRINT:INPUT"建模启始年T1=“;T1
230 INPUT"建模中止年T2=“;T2
240 PRINT"建模起止年(或序号)";T1;"---";T2
250 M=T2-T0+1:M0=T1-T0+1
260 GOTO 1370
270 DIM A(M,N),B(N,M),C(N,N*2),D(N.N*2),E(N,1),X(N),X0(N,M),X1(N,M),G(M),XX(N,MN)
280 GOTO 1370
290 FOR I=1 TO N
300 FOR J=M0 TO M-1
310 A(J,I)=B(J,I)
320 NEXT J
330 NEXT I
340 PRING"***************A(i,j)******************"
350 FOR I=M9 TO M-1
360 FOR J=1 TO N
370 PRINT A(I,J);"      “;
380 NEXT J
390 PRINT
400 NEXT I
410 PRINT"************AtA**************"
420 FOR I=1 TO N
430 FOR K=1 TO N
440 C(I,K)=0
450 FOR J=M0 TO M-1
460 C(I,K)=C(I,K)+B(I,J)*A(J,K)
470 NEXT J
480 PRINT C(I,K);"      “;
490 IF I=K THEN 520
500 C(I,K+N)=0
510 GOTO 530
520 C(I,K+N)=1
530 NEXT K
540 PRINT
550 NEXT I
560 PRINT"***********(AtA)-1************"
570 FOR I=1 TO N-1
580 FOR K=I+1 TO N
590 FOR J=1+I TO 2*N
600 C(K,J)=C(K,J)-C(I,J)/C(I,I)*C(K,I)
610 NEXT J
620 NEXT K
630 NEXT I
640 FOR I=1 TO N
650 FOR J=1 TO N*2
660 D(I,J)=C(I,J)/C(I,I)
670 NEXT J
680 NEXT I
690 FOR I=N TO 2 STEP -1
700 FOR K=I-1 TO 1 STEP -1
710 FOR J=N*2 TO I STEP -1
720 D(K,J)=D(K,J)-D(I,J)/D(I,J)*D(K,I)
730 NEXT J
740 NEXT K
750 NEXT I
760 FOR I=1 TO N
770 FOR J=N+1 TO N*2
780 PRINT D(I,J);"      “
790 NEXT J
800 PRINT
810 NEXT I
820 PRINT"************Yn************"
830 FOR I=M0 TO M-1
840 Y(I,1)=X0(1,I+1)
850 PRINT Y(I,1);"      “;
860 NEXT I
870 PRINT
880 PRINT"**********AtYn***********"
890 FOR I=1 TO N
900 E(I,1)=0
910 FOR J=M0 TO M-1
920 E(I,1)=E(I,1)+B(I,J)*Y(J,1)
930 NEXT J
940 PRINT E(I,1)
950 NEXT I
960 PRINT"***********系数向量*************"
970 FOR I=1 TO N
980 X(I)=0
990 FOR J=N+1 TO N*2
1000 X(I)=X(I)+D(I,J)*E(J-N,1)
1010 NEXT J
1020 IF I>1 THEN 1050
1030 PRINT"^a=“;X(I)
1040 GOTO 1060
1050 PRINT"^b";I-1;"=“;X(I)
1060 NEXT I
1070 PRINT"------------状态方程时间函数---------------"
1080 PRINT"^X1(t=1)=(“;X0(1,M0);")"
1090 FOR I=2 TO N
1100 PRINT"-";X(I)/X(1);"X";I;
1110 NEXT I
1120 PRINT")e      “;-X(1);"t      “
1130 FOR I=2 TO N
1140 PRINT"+";X(I)/X(1);"x";I;"      “
1150 NEXT I
1160 PRINT
1170 PRINT"---------------^X1(i)-----------------------"
1180 FOR J=M0 TO M
1190 GOSUB 1850
1200 G=S*EXP(-X(1)*(J-1))
1210 FOR I=2 TO N
1220 G(J)=G+(X(I)/X(1))*X1(I,J)
1230 G=G(J)
1240 NEXT I
1250 PRINT"^x1(“;T1-M0+J;")=“;G(J);"------";X1(1,J)
1260 NEXT J
1270 PRINT"--------拟合值---------拟合差----------%---------"
1280 FOR T=M0 TO M-1
1290 X=G(T+1)-G(T)
1300 E=XX(1,T+1)-X
1310 P=E/XX(1,T+1)
1320 IF T1-M0+T+1<T2-4 THEN 1350
1330 PRINT"^X0(“;T1-M0+T+1;")=“;X;"------";XX(1,T+1)
1340 PRINT"    e=“;E;"    q=“;p*100;"%"
1350 NEXT T
1360 GOTO 1910
1370 PRINT"----------原始数据-----------"
1380 FOR I=1 TO GS
1390 PRINT MC$(I);"      “;
1400 FOR J=1 TO MN
1410 “READ Z(I,J)
1420 IF J<M0 THEN 1440
1430 PRINT Z(I,J);"      “;
1440 NEXT J:PRINT
1450 NEXT I
1460 PRINT"请按任意键继续------"
1470 AA$=INKEY$:IF AA$=““ THEN 1470
1480 GOSUB 1970
1490 PRINT:INPUT"数据平滑吗?(y/n)";DD$
1500 IF DD$=“Y" OR DD$=“y" THEN 1510 ELSE GOTO 1620
1510 PRINT:PRINT"----------建模数据-----------"
1520 FOR I=1 TO N
1530 X0(I,M0)=(3*XX(I,M0)+XX(I,M0+1))/4
1540 PRINT X0(I,M0);"      “;
1550 FOR J=M0+1 TO M-1
1560 X0(I,J)=(XX(I,J-1)+2*XX(I,J)+XX(I,J+1))/4
1570 PRINT X0(I,J);"      “;
1580 NEXT J
1590 X0(I,M)=(XX(I,M-1)+3*XX(I,M))/4
1600 PRINT X0(I,M)
1610 NEXT I:GOTO 1670
1620 PRINT:PRINT"--------------建模数据----------------"
1630 FOR I=1 TO N:FOR J=1 TO M
1640 X0(I,J)=XX(I,J):IF J<M0 THEN 1660
1650 PRINT X0(I,J);"      “;
1660 NEXT J:PRINT:NEXT I
1670 PRINT"----------X1(i,j)------------"
1680 FOR I=1 TO N
1690 T=0
1700 FOR J=M0 TO M
1710 T=T+X0(I,J)
1720 X1(I,J)=T
1730 PRINT X1(I,J);"   “;
1740 NEXT J:PRINT
1750 NEXT I
1760 FOR I=1 TO N
1770 FOR J=M0 TO M-1
1780 IF I<>1 THEN 1810
1790 B(I,J)=-(X1(I,J+1)+X1(I,J))/2
1800 GOTO 1820
1810 B(I,J)=X1(I,J+1)
1820 NEXT J
1830 NEXT I
1840 GOTO 290
1850 S0=X0(1,M0)
1860 FOR I=2 TO N
1870 S=S0-X1(I,J)*X(I)/X(1)
1880 S0=S
1890 NEXT I
1900 RETURN
1910 PRINT"---------------END----------------"
1920 INPUT"打印结果吗?(Y/N)";D$
1930 IF D$=“Y" OR D$=“y" THEN GOSUB 2120
1940 INPUT"更换变量或时段继续计算吗?(Y/N)";JX$
1950 IF JX$=“Y" OR IX$=“y" THEN 210
1960 END
1970 CLS:LOCATE 1,50:PRINT SPC(25)
1980 LOCATE 1,50:PRINT"序号          变量名称"
1990 FOR I=1 TO GS
2000 LOCATE I+1,50:PRINT SPC(25)
2010 LOCATE I+1,50:PRINT I;:LOCATE I+1,60:PRINT MC$(I)
2020 NEXT
2030 PRINT"请输入状态方程的变量总数:N=“;:INPUT"“,N
2040 FOR I=1 TO N
2050 IF I=1 THEN 2060 ELSE 2070
2060 PRINT"请输入主导变量的序号:";:INPUT"“,KK(I):GOTO 2080
2070 PRINT"请输入第";I-1;"个关联变量的序号:";:INPUT"“,KK(I)
2080 FOR J=1 TO M
2090 XX(I,J)=Z(KK(I),J)
2100 NEXT:NEXT:RETURN
2110 END
2120 LPRINT"-----------[“;WJ$;"]GM(1,N)状态方程-------------"
2130 LPRINT"建立起止年(或序号):";TI;"------";T2
2140 LPRINT"------------原始数据-------------"
2150 FOR I=1 TO N
2160 LPRINT MC$(KK(I));"      “;
2170 FOR J=1 TO MN
2180 IF J<M0 THEN 2200
2190 LPRINT XX(I,J);"      “;
2200 NEXT J:LPRINT
2210 NEXT I
2220 LPRINT"------------系数向量---------------"
2230 FOR I=1 TO N
2240 IF I>1 THEN 2270
2250 LPRINT"^a=“;X(I)
2260 GOTO 2280
2270 LPRINT"^b";I-1;"=“;X(I)
2280 NEXT I
2290 LPRINT"---------------状态方程时间函数------------------"
2300 LPRINT"^X1(t+1)=(“;X0(1,M0);
2310 FOR I=2 TO N
2320 LPRINT"-";X(I)/X(1);"x";I;
2330 NEXT I
2340 LPRINT")e";-X(1);"t";
2350 FOR I=2 TO N
2360 LPRINT"+";X(I)/X(1);"x";I;"      “;
2370 NEXT I
2380 LPRINT
2390 LPRINT"-----拟合值------拟合差-------%-----"
2400 FOR T=M0 TO M-1
2410 X=G(T+1)-G(T)
2420 E=XX(1,T+1)-X
2430 P=E/XX(1,T+1)
2440 IF T1-M0+T+1<T2-4 THEN 2470
2450 LPRINT"^X0(“;T1-M0+T+1;")=“;X;"---------";XX(1,T+1);
2460 LPRINT"      e=“;E;"      q=“;P*100;"%"
2470 NEXT T
2480 LPRINT"------------------------------------------"
2490 RETURN
5000 CHAIN "SJWJ2"

ppjj 发表于 2007-6-11 19:49

有高手帮忙改成VB或者其它语言的更好

gerry 发表于 2007-6-13 16:15

天哪……GWBASIC……好亲切,仿佛回到了十年前……

ppjj 发表于 2007-6-14 12:51

能不能帮忙检查一下,2090行提示XX(I,J)下标越界
5000 CHAIN "SJWJ2"是联结的一个文件程序

suffer 发表于 2007-6-15 09:06

原帖由 ppjj 于 2007-6-14 12:51 发表 http://www.chinavib.com/forum/images/common/back.gif
能不能帮忙检查一下,2090行提示XX(I,J)下标越界
5000 CHAIN "SJWJ2"是联结的一个文件程序

是不是你输入的TN小于T2?
页: [1]
查看完整版本: BASIC程序求助