112 10A Building A 10 F 112 ShinTaiWu
台北總公司/台北縣汐止市新台五路一段 112號 10樓A棟 Building A, 10 F, 112, Shin-Tai-Wu Road Sec. 1, Shijr, Taipei, Taiwan. 電話/ 02 -26962869 傳真/ 02 -26962867 台中辦事處/台中市文心路一段 540號 4樓-1 4 -1 F, 540, Wen Shing Road, Sec. 1, Taichung, Taiwan. 電話/ 04 -23287870 傳真/ 04 -23108168 博碩網址:http: //www. drmaster. com. tw
2 -1 線性同餘法 class Rei 08 Panel extends Panel { int rndnum=13; // 亂數的初始值 int irnd() { // 0~ 32767的整數亂數 rndnum=(rndnum*109+1021) % 32768; return rndnum; } } public void paint(Graphics g) { int i, y=1; g. draw. String("所求得的一致亂數", 0, 20); for (i=0; i<100; i++) { if (i%8==0) y++; g. draw. String(""+irnd(), (i%8)*60, y*20); } }
2 -2 數值積分 public void action. Performed(Action. Event e) { int k; double a, b, n, h, x, s, sum; a=Double. parse. Double(tf 1. get. Text()); b=Double. parse. Double(tf 2. get. Text()); n=50; // a~b間的分割數 h=(b-a)/n; // 區間幅度 x=a; s=0; for (k=1; k<=n-1; k++) { x=x+h; s=s+f(x); } sum=h*((f(a)+f(b))/2+s); String result=" /"+b+"n"+ " | sqrt(4 -x*x) ="+sum+"n"+ " /"+a; ta. set. Text(result); }
2 -2 辛普森法則定積分 public void action. Performed(Action. Event e) { int k; double a, b, n, h, fo, fe, sum; a=Double. parse. Double(tf 1. get. Text()); b=Double. parse. Double(tf 2. get. Text()); n=50; // a~b之間的分割數 h=(b-a)/(2*n); // 區間幅度 fo=0; fe=0; for (k=1; k<=2*n-3; k=k+2) { fo=fo+f(a+h*k); fe=fe+f(a+h*(k+1)); } sum=(f(a)+f(b)+4*(fo+f(b-h))+2*fe)*h/3; String result=" /"+b+"n"+ " | sqrt(4 -x*x) ="+sum+"n"+ " /"+a; ta. set. Text(result); }
double myexp(double x) { final double EPS=1 e-08; double s=1. 0, e=1. 0, d=1. 0; int k; for (k=1; k<=200; k++) { d=s; e=e*x/k; s=s+e; if (Math. abs(s-d)<EPS*Math. abs(d)) return s; } return 0. 0; // 沒有收斂時 // 截斷誤差 } public void paint(Graphics g) { double x; g. draw. String(" x myexp(x) for (x=0; x<=40; x=x+10) { g. draw. String(""+x, 20, (int)x*2+40); g. draw. String(""+myexp(x), 80, (int)x*2+40); g. draw. String(""+Math. exp(x), 260, (int)x*2+40); } } exp(x)", 0, 20);
double myexp(double x) { final double EPS=1 e-08; double s=1. 0, e=1. 0, d=1. 0, a; int k; a=Math. abs(x); for (k=1; k<=200; k++) { d=s; e=e*a/k; s=s+e; if (Math. abs(s-d)<EPS*Math. abs(d)) { if (x>0) return s; else return 1. 0/s; } } return 0. 0; // 沒有收斂時 // 截斷誤差 } public void paint(Graphics g) { double x; g. draw. String(" x myexp(x)", 0, 20); for (x=-40; x<=40; x=x+10) { g. draw. String(""+x, 20, (int)(x+40)*2+40); g. draw. String(""+myexp(x), 80, (int)(x+40)*2+40); g. draw. String(""+Math. exp(x), 260, (int)(x+40)*2+40); } }
class Dr 10_2 Panel extends Panel { double mycos(double x) { final double EPS=1 e-08; double s=1. 0, e=1. 0, d=1. 0; int k; x=(x-(int)x+(int)x%360)*3. 1415927/180; // x的值須收斂在 0~ 2π內 for (k=1; k<=200; k=k+2) { d=s; e=-e*x*x/(k*(k+1)); s=s+e; if (Math. abs(s-d)<EPS*Math. abs(d)) // 截斷誤差 return s; } return 9999. 0; // 沒有收斂時 } public void paint(Graphics g) { double x; g. draw. String(" x mycos(x)", 0, 20); for (x=0; x<=180; x=x+10) { g. draw. String(""+x, 20, (int)x*2+40); g. draw. String(""+mycos(x), 80, (int)x*2+40); g. draw. String(""+Math. cos(x*3. 1415927/180), 260, (int)x*2+40); } }
class Rei 11 Panel extends Panel { double f(double x) { return x*x*x-x+1; } public void paint(Graphics g) { final double EPS=1 e-08; // 截斷誤差 final int LIMIT=50; // 截斷次數 double low, high, x; int k=1; low=-2. 0; high=2. 0; for (k=1; k<=LIMIT; k++) { x=(low+high)/2; if (f(x)>0) high=x; else low=x; if (f(x)==0 || Math. abs(high-low)<Math. abs(low)*EPS) { g. draw. String("x="+x, 10, 20); break; } } if (k>LIMIT) g. draw. String("沒有收斂", 10, 20); } }
class Dr 11 Panel extends Panel { double f(double x) { return x*x*x-x+1; } double g(double x) { // 微分函數 return 3*x*x-1; } public void paint(Graphics g) { final double EPS=1 e-08; // 截斷誤差 final int LIMIT=50; // 截斷次數 double x=-2. 0, dx; int k; for (k=1; k<=LIMIT; k++) { dx=x; x=x-f(x)/g(x); if (Math. abs(x-dx)<Math. abs(dx)*EPS) { g. draw. String("x="+x, 10, 20); break; } } if (k>LIMIT) g. draw. String("沒有收斂", 10, 20); } }
class Rei 12 Panel extends Panel { double lagrange(double x[], double y[], int n, double t) { int i, j; double s, p; s=0. 0; for (i=0; i<n; i++) { p=y[i]; for (j=0; j<n; j++) { if (i!=j) p=p*(t-x[j])/(x[i]-x[j]); } s=s+p; } return s; } public void paint(Graphics g) { double[] x={0. 0, 1. 0, 3. 0, 6. 0, 7. 0}, y={0. 8, 3. 1, 4. 5, 3. 9, 2. 8}; double t; } } g. draw. String("x y", 10, 20); for (t=0. 0; t<=7. 0; t=t+. 5) { g. draw. String(""+t, 10, (int)(t*40+40)); g. draw. String(""+lagrange(x, y, 5, t), 70, (int)(t*40+40)); }
class Dr 12 Panel extends Panel { double newton(double x[], double y[], int n, double t) { int flag=1, i, j; double[] a=new double[100]; // 係數陣列 double[] w=new double[100]; // 作業用 double s; if (flag==1) { // 僅在第 1次被呼叫時,才在a[]內求係數 for (i=0; i<n; i++) { w[i]=y[i]; for (j=i-1; j>=0; j--) w[j]=(w[j+1]-w[j])/(x[i]-x[j]); a[i]=w[0]; } flag=-1; } s=a[n-1]; // x=t時的內插 for (i=n-2; i>=0; i--) s=s*(t-x[i])+a[i]; return s; } public void paint(Graphics g) { double[] x={0. 0, 1. 0, 3. 0, 6. 0, 7. 0}, y={0. 8, 3. 1, 4. 5, 3. 9, 2. 8}; double t; } } g. draw. String("x y", 10, 20); for (t=0. 0; t<=7. 0; t=t+. 5) { g. draw. String(""+t, 10, (int)(t*40+40)); g. draw. String(""+newton(x, y, 5, t), 70, (int)(t*40+40)); }
class Rei 13 Panel extends Panel { private final int KETA=20, // 位數 N=(KETA-1)/4+1; // 陣列大小 void ladd(int a[], int b[], int c[]) { // long數+long 數 int i, cy=0; for (i=N-1; i>=0; i--) { c[i]=a[i]+b[i]+cy; if (c[i]<10000) cy=0; else { c[i]=c[i]-10000; cy=1; } } } void lsub(int a[], int b[], int c[]) { // long數-long 數 int i, brrw=0; for (i=N-1; i>=0; i--) { c[i]=a[i]-brrw; if (c[i]>=0) brrw=0; else { c[i]=c[i]+10000; brrw=1; } } } void print(Graphics g, int c[], int p) { // 顯示位數 int i; for (i=0; i<N; i++) { String s="0000"+c[i]; // 在前方空白處補上0 g. draw. String(s. substring(s. length()-4, s. length()), i*40, p); } } public void paint(Graphics g) { int[] a={1999, 4444, 7777, 2222, 9999}, b={ 111, 6666, 3333, 8888, 1111}, c=new int[N+2]; } } ladd(a, b, c); print(g, c, 20); lsub(a, b, c); print(g, c, 40);
class Dr 13 Panel extends Panel { private final int KETA=20, // 位數 N=(KETA-1)/4+1; // 陣列大小 void lmul(int a[], int b, int c[]) { // long數 x short數 int i, d, cy=0; for (i=N-1; i>=0; i--) { d=a[i]; c[i]=(d*b+cy)%10000; cy=(d*b+cy)/10000; } } void ldiv(int a[], int b, int c[]) { // long數 ÷ short數 int i, d, rem=0; for (i=0; i<N; i++) { d=a[i]; c[i]=(d+rem)/b; rem=((d+rem)%b)*10000; } } void print(Graphics g, int c[], int p) { // 顯示位數 int i; for (i=0; i<N; i++) { String s="0000"+c[i]; // 在前方空白處補上0 g. draw. String(s. substring(s. length()-4, s. length()), i*40, p); } } public void paint(Graphics g) { int[] a={ 0, 3050, 2508, 8080, 1233}, c=new int[N+2]; } } lmul(a, 101, c); print(g, c, 20); ldiv(a, 200, c); print(g, c, 40);
2 -7 π的多位數計算 … public void paint(Graphics g) { int[] s=new int[L 2+2], w=new int[L 2+2], v=new int[L 2+2], q=new int[L 2+2]; int k; for (k=0; k<=L 2; k++) s[k]=w[k]=v[k]=q[k]=0; w[0]=16*5; v[0]=4*239; // 馬欽公式 for (k=1; k<=N; k++) { ldiv(w, 25, w); ldiv(v, 239, v); lsub(w, v, q); ldiv(q, 2*k-1, q); if ((k%2)!=0) // 判斷為奇數項或偶數項 ladd(s, q, s); else lsub(s, q, s); } printresult(g, s); } } …
class Dr 14_1 Panel extends Panel { private final int L=1000, // 所要求出的位數 L 1=L/4+1, // 陣列大小 L 2=L 1+1, // 多取 1個 N=451; // 欲計算的項數. . void printresult(Graphics g, int c[]) { // 顯示結果 int i, y=0; String s; g. draw. String(""+c[0]+". ", 0, 20); // 顯示最高位數 for (i=1; i<L 1; i++) { if ((i-1)%15==0) y++; s="0000"+c[i]; g. draw. String(s. substring(s. length()-4, s. length()), ((i-1)%15)*40, y*20+20); } } public void paint(Graphics g) { int[] s=new int[L 2+2], w=new int[L 2+2]; int k; for (k=0; k<=L 2; k++) s[k]=w[k]=0; s[0]=w[0]=1; for (k=1; k<=N; k++) { ldiv(w, k, w); ladd(s, w, s); } printresult(g, s); } }
2 -8 聯立方程式的解法(高斯‧喬丹法) public void paint(Graphics g) { final int N=3; // 原有的數 int i, j, k; double[][] a={{2. 0, 3. 0, 1. 0, 4. 0}, // 係數矩陣 {4. 0, 1. 0, -3. 0, -2. 0}, {-1. 0, 2. 0}}; double p, d; for (k=0; k<N; k++) { p=a[k][k]; // 軸係數 for (j=k; j<N+1; j++) // 將軸行除以p a[k][j]=a[k][j]/p; for (i=0; i<N; i++) { // 清掃軸列 if (i!=k) { d=a[i][k]; for (j= k; j<N+1; j++) a[i][j]=a[i][j]-d*a[k][j]; } } for (k=0; k<N; k++) g. draw. String("x"+(k+1)+"="+a[k][N], 10, k*20+20);
z 1 2 3 -2 ↑ 列的選擇 3 3 1 -1 1 0 0 0 0 1 0 18 21 21 0 18 21/2 21/3 0 0 1 0 8/3 7/3 1/3 -1/3 ↑ 列的選擇 1 0 0 -1/8 -2/3 1/3 2/3 11 7 7 14 33/8 3 21 x 1 0 0 1 0 x 2 0 1 0 0 0 -8/7 3/7 -1/7 3/7 -2/7 3/7 12/21 3 3 6 15 ←行的選擇 ←的最適解 ←z的最適解
……… …… double[][] a={{1. 0, 2. 0, 1. 0, 0. 0, 14. 0}, {1. 0, 0. 0, 8. 0}, {3. 0, 1. 0, 0. 0, 18. 0}, {-2. 0, -3. 0, 0. 0}}; double min, p, d; while (true) { min=9999; // 列的選擇 for (k=0; k<N 2 -1; k++) { if (a[N 1 -1][k]<min) { min=a[N 1 -1][k]; y=k; } } if (min>=0) break; min=9999; // 行的選擇 for (k=0; k<N 1 -1; k++) { p=a[k][N 2 -1]/a[k][y]; if (a[k][y]>0 && p<min) { min=p; x=k; } } p=a[x][y]; // 軸係數 for (k=0; k<N 2; k++) // 以p除以軸行 a[x][k]=a[x][k]/p; for (k=0; k<N 1; k++) { // 清掃軸列 if (k!=x) { d=a[k][y]; for (j=0; j<N 2; j++) a[k][j]=a[k][j]-d*a[x][j]; } } } for (k=0; k<N 3; k++) { flag=-1; for (j=0; j<N 1; j++) { if (a[j][k]==1) flag=j; } // 係數矩陣
- Slides: 50