在TI-83/84上绘制隐函数

Texus Instrument-83(+)、84(+、SE)绘图计算器只能绘制显函数(即y=f(x)),对于隐函数就无能为力了。虽然在电脑上用软件能马上画出来,但还是自己编了个程序。

后来才找到原来这样的程序网上很多(都不在TI的官网),但是很多程序都是为TI-89设计的,所以我的这个程序在中学生的主流机器中还是有一定是实用价值的。

开发过程:整个程序有一个主思路,就是给定一个X的值,解出Y值。一连串这样的(x,y)就可以画出整个函数。
一开始,我不知道计算器可以直接给变量代值,所以花了一大串代码通过修改字符串的方式更改X的值。如下:
Input “EQUATION: “,Str1 “输入一个Equation,×××=0的左边部分,包括X和Y。

For(I,Xmin,Xmax,1) ”开始循环,插入不同的X值

{0,1}→L₁ “此部分将特定X值变为字符串变量Str2
{0,I}→L₂
LinReg(ax+b) Y₂
EquString(Y₂,Str2)
FnOff 2

sub(Str2,1,length(Str2)-3)→Str2 ”给特定X值加上(),一边替换“X”
“(“+Str2+”)”→Str2
Str1→Str5

Repeat inString(Str5,”X”)=0 “不停寻找原Eqaution中的”X“,将其替换为Str2

inString(Str5,”X”)→N
“(1)”→Str3
“(1)”→Str4

If N>1 ”找到某个“X”的前面部分
Then
sub(Str5,1,N-1)→Str3
End

length(Str5)→L

If N+1
Then
sub(Str5,N+1,L-N)→Str4
End
Str3+Str2+Str4→Str5 “把方程进行拼接
End

StringEqu(Str5,Y₁) “得到代入X值后的方程Y1

FnOff 1
….

后来发现完全不用这样,只需要给X赋值,Y1的值自动变了。
接下来就是要解这个关于Y的方程。
原本是用的计算器自带的函数”solve()“,很有特点,只要找不到根程序就崩溃跳出,TI-BASIC这种低端语言也不可能支持Error Exception.
上网查了些资料后,把解方程步骤根据牛顿迭代法自己写了一段,没有根自动跳出循环寻找下一个。

以下为程序源代码(语言:Z80 TI-BASIC;平台TI-83/TI-83 Plus/TI-84 Plus/TI-84 Plus Silver Edition):
注:代码里有个三角符号是显示不出的,请大家使用时注意。

Input “CLR GRAPH?(1/0)”,L ”询问是否要清除原有图像,所有
“图像坐标都保存在List里,如果
”原List有信息,请输入1
If L
Then                                              ”初始化List,赋给初值,避免错误
ClrAllLists
{Xmin}→L₁
{Ymin}→L₂
{Xmin}→L₃
{Ymin}→L₄
{Xmin}→L₅
{Ymin}→L₆
End

Plot1(xyLine,L₁,L₂,·)        “初始化各个Plot
Plot2(xyLine,L₃,L₄,·)
Plot3(xyLine,L₅,L₆,·)

(Xmax-Xmin)/30→Q                     “每次X的Step,用户可以改变30,
”越高的值代表精度越高,计算时间越长。
(Ymax-Ymin)/3→W              “每次Y的初始猜测的Step

Input “EQUATION: “,Str1    “输入方程,只输入“=0”的左边
StringEqu(Str1,Y₁)
FnOff 1,2,3

For(I,Xmin,Xmax,Q)      “开始关于X的循环

I→X “给X赋值
0→C “该变量保存对于特定X值计算到了第几个Y根

For(J,Ymin,Ymax,W) “开始关于Y的循环
J→R “给R赋值,初始猜测。
0→B “该变量保存是否跳出牛顿迭代(找到根或找不到根)
0→G “该变量保存是否找到根
Ymax-Ymin→Z “该变量保存上一次Y1的值

Repeat B “开始迭代
Disp R “在屏幕上刷新显示迭代的值,避免用户认为死机

If nDeriv(Y₁,Y,R)≠0 “如果导数不为零,则开始牛顿迭代
Then
R→Y
R-Y₁/(nDeriv(Y₁,Y,R))→R
R→Y

If abs(Y₁)<0.0001 “满足条件,得到根
Then 1→B 1→G
End

If Y>Ymax or Y<Ymin”Y大于框限制,跳出
Then
1→B
0→G

End
Y₁→Z”新Y1值赋给Z

Else”导数为零的情况
1→B
0→G
End
End

If G”如果找到根
Then

If C=0″如果为第一个根
Then
If dim(L₂)=1 and L₂(1)=Ymin
Then
X→L₁(1)
Y→L₂(1)
Else
X→L₁(1+dim(L₁))
Y→L₂(1+dim(L₂))
End
C+1→C
End

If C=1 and abs(R-L₂(dim(L₂)))>0.001″如果为第二个根且不等于第一个
Then
If dim(L₄)=1 and L₄(1)=Ymin
Then
X→L₃(1)
Y→L₄(1)
Else
X→L₃(1+dim(L₃))
Y→L₄(1+dim(L₄))
End
C+1→C
End


Then
1→B
0→G
End
Y₁→Z
Else
1→B
0→G
End
End
If G
Then
If C=0
Then
If dim(L₂)=1 and L₂(1)=Ymin
Then
X→L₁(1)
Y→L₂(1)
Else
X→L₁(1+dim(L₁))
Y→L₂(1+dim(L₂))
End
C+1→C
End
If C=1 and abs(R-L₂(dim(L₂)))>0.001
Then
If dim(L₄)=1 and L₄(1)=Ymin
Then
X→L₃(1)
Y→L₄(1)
Else
X→L₃(1+dim(L₃))
Y→L₄(1+dim(L₄))
End
C+1→C
End

If C=2 and abs(R-L₂(dim(L₂)))>0.001 and abs(R-L₄(dim(L₄)))>0.001 and abs(R-L₆(dim(L₆)))>0.001“如果是第三个根且不等于第一、二根

Then
If dim(L₆)=1 and L₆(1)=Ymin
Then
X→L₅(1)
Y→L₆(1)
Else
X→L₅(1+dim(L₅))
Y→L₆(1+dim(L₆))
End
C+1→C
End

End

End
End

ClrDraw
Text(55,0,Str1+”=0″) “签名
Text(0,0,”IMPLICIT GRAPHER -MENGYE”)

运行截图:

Run
Run
Graph Result
Graph Result

已知不足:
绘制时间很长:大约精度在30时是2分钟不到,精度越高时间越长。

源码下载地址:http://mengyer.com/project/IMPLI2.8xp

“在TI-83/84上绘制隐函数”上的7条回复

  1. 课上讨论的圆为什么是360度
    ======分隔线=============
    为什么确定圆是360度
    大约在6000年前,美索不达米亚人发明了车轮。他们很喜欢60这个数字,因为60很有用,又有很多因素,用来进行基本运算或做生意都很方便。布拉克斯玛(Mary Blocksma)的书《阅读数字》(Reading the Numbers)中提到,美索不达米亚人的这套60进位数字系统传到了古埃及,而古埃及人则用这套系统把圆分成360度。360度的圆对古埃及人来说非常好用。他们很喜欢正三角形,而一个圆刚好可以容纳6个正三角形。由于圆刚好由6个内角都为60度的三角形组成,所以圆内角为360度相当合理。埃及人也发明了角度的符号,他们还发明了一年360天的历制,和现代的历制只差了5.25天。之后,使用360度的圆更通过了时间的考验,进而影响到了时间刻度:人们首次在圆面上记录时间时,就很自然地把每小时分成60分钟,每分钟分成60秒。

    ===============
    另一个
    ===============
    角度,钟表的60进制都是为了等分方便确立的
    圆周规定为360度的原因,现在比较认可的说法是:古埃及人认为360天为一年(虽然和实际有些出入),一年的时间正好观测到黄道面循环一周,而且古人用一种朴素的哲学上的统一观点,认为360是一个世界上的常数,因此后来在天文观测以及圆周丈量的时候就用360做为圆周的度数.

    古巴比伦人用的是60进制,至今人类在记录时间及角度时,仍然采用60进制。60可以被2、3、4、5、6、10、12、15、20、30整除,它所含因数有10个之多,在100以内的数中,它的因数是最多的,只有96可与之匹敌。但96比60大得多。这样,在分割60时,可较少地出现小数。这是60进制至今还在沿用的原因。

评论已关闭。