⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nlequations.java

📁 《Java数值计算算法编程》随书代码 已生成DOCS说明文件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	 		pq=Math.sqrt(ar[k]*ar[k]+ai[k]*ai[k]);
	 		while (pq<1.0e-12)
	         { 
	 			xr[k-1]=0.0; 
	 			xi[k-1]=0.0; 
	 			k=k-1;
	             if (k==1)
	             { 
	 				p=ar[0]*ar[0]+ai[0]*ai[0];
	                 xr[0]=-w*(ar[0]*ar[1]+ai[0]*ai[1])/p;
	                 xi[0]=w*(ar[1]*ai[0]-ar[0]*ai[1])/p;
	                 
	 				return true;
	             }
	             
	 			pq=Math.sqrt(ar[k]*ar[k]+ai[k]*ai[k]);
	         }
	 		
	 		q=Math.log(pq); 
	 		q=q/(1.0*k); 
	 		q=Math.exp(q);
	         p=q; 
	 		w=w*p;
	         for (i=1; i<=k; i++)
	         { 
	 			ar[i]=ar[i]/q; 
	 			ai[i]=ai[i]/q; 
	 			q=q*p;
	 		}
	         
	 		x=0.0001; 
	 		x1=x; 
	 		y=0.2; 
	 		y1=y; 
	 		dx=1.0;
	         g=1.0e+37; 
	 
	         while (true)
	         {
		         u=ar[0]; 
		 		v=ai[0];
		         for (i=1; i<=k; i++)
		         { 
		 			p=u*x1; 
		 			q=v*y1;
		             pq=(u+v)*(x1+y1);
		             u=p-q+ar[i]; 
		 			v=pq-p-q+ai[i];
		         }
		         
		 		g1=u*u+v*v;
		         if (g1>=g)
		         { 
		 			if (is!=0)
		             { 
		 				 it=1;
		 				 Real xtmp = new Real(x);
		 				 Real ytmp = new Real(y);
		 				 Real x1tmp = new Real(x1);
		 				 Real y1tmp = new Real(y1);
		 				 Real dxtmp = new Real(dx);
		 				 Real dytmp = new Real(dy);
		 				 Real ddtmp = new Real(dd);
		 				 Real dctmp = new Real(dc);
		 				 Real ctmp = new Real(c);
		 				 Real ktmp = new Real(k);
		 				 Real istmp = new Real(is);
		 				 Real ittmp = new Real(it);
		                 g65c(xtmp, ytmp, x1tmp, y1tmp, dxtmp, dytmp, ddtmp, dctmp, ctmp, ktmp, istmp, ittmp);
		                 x=xtmp.doubleValue();
						 y=ytmp.doubleValue();
						 x1=x1tmp.doubleValue();
						 y1=y1tmp.doubleValue();
						 dx=dxtmp.doubleValue();
						 dy=dytmp.doubleValue();
						 dd=ddtmp.doubleValue();
						 dc=dctmp.doubleValue();
						 c=ctmp.doubleValue();
						 k=ktmp.intValue(); 
						 is=istmp.intValue();
						 it=ittmp.intValue();
		                 if (it==0) 
		 					continue;
		             }
		             else
		             { 
		 				 Real ttmp = new Real(t);
		 				 Real xtmp = new Real(x);
		 				 Real ytmp = new Real(y);
		 				 Real x1tmp = new Real(x1);
		 				 Real y1tmp = new Real(y1);
		 				 Real dxtmp = new Real(dx);
		 				 Real dytmp = new Real(dy);
		 				 Real ptmp = new Real(p);
		 				 Real qtmp = new Real(q);
		 				 Real ktmp = new Real(k);
		 				 Real ittmp = new Real(it);
		 				 g60c(ttmp,xtmp,ytmp,x1tmp,y1tmp,dxtmp,dytmp,ptmp,qtmp,ktmp,ittmp);
		                 t=ttmp.doubleValue();
		                 x=xtmp.doubleValue();
						 y=ytmp.doubleValue();
						 x1=x1tmp.doubleValue();
						 y1=y1tmp.doubleValue();
						 dx=dxtmp.doubleValue();
						 dy=dytmp.doubleValue();
						 p=ptmp.doubleValue();
						 q=qtmp.doubleValue();
						 k=ktmp.intValue(); 
						 it=ittmp.intValue();
		                 if (t>=1.0e-03) 
		 					continue;
		                 
		 				if (g>1.0e-18)
		                 { 
		 					it=0;
			 				 Real xtmp1 = new Real(x);
			 				 Real ytmp1 = new Real(y);
			 				 Real x1tmp1 = new Real(x1);
			 				 Real y1tmp1 = new Real(y1);
			 				 Real dxtmp1 = new Real(dx);
			 				 Real dytmp1 = new Real(dy);
			 				 Real ddtmp1 = new Real(dd);
			 				 Real dctmp1 = new Real(dc);
			 				 Real ctmp1 = new Real(c);
			 				 Real ktmp1 = new Real(k);
			 				 Real istmp1 = new Real(is);
			 				 Real ittmp1 = new Real(it);
			                 g65c(xtmp1, ytmp1, x1tmp1, y1tmp1, dxtmp1, dytmp1, ddtmp1, dctmp1, ctmp1, ktmp1, istmp1, ittmp1);
			                 x=xtmp1.doubleValue();
							 y=ytmp1.doubleValue();
							 x1=x1tmp1.doubleValue();
							 y1=y1tmp1.doubleValue();
							 dx=dxtmp1.doubleValue();
							 dy=dytmp1.doubleValue();
							 dd=ddtmp1.doubleValue();
							 dc=dctmp1.doubleValue();
							 c=ctmp1.doubleValue();
							 k=ktmp1.intValue(); 
							 is=istmp1.intValue();
							 it=ittmp1.intValue();
		                     if (it==0) 
		 						continue;
		                 }
		             }
		             
	 				 Real xtmp = new Real(x);
	 				 Real ytmp = new Real(y);
	 				 Real ptmp = new Real(p);
	 				 Real wtmp = new Real(w);
	 				 Real ktmp = new Real(k);
		 			 g90c(xr,xi,ar,ai,xtmp,ytmp,ptmp,wtmp,ktmp);
	                 x=xtmp.doubleValue();
					 y=ytmp.doubleValue();
					 p=ptmp.doubleValue();
					 w=wtmp.doubleValue();
					 k=ktmp.intValue(); 
		 			break;
		         }
		         else
		         { 
		 			g=g1; 
		 			x=x1; 
		 			y=y1; 
		 			is=0;
		             if (g<=1.0e-22)
		             {
		 				 Real xtmp = new Real(x);
		 				 Real ytmp = new Real(y);
		 				 Real ptmp = new Real(p);
		 				 Real wtmp = new Real(w);
		 				 Real ktmp = new Real(k);
			 			 g90c(xr,xi,ar,ai,xtmp,ytmp,ptmp,wtmp,ktmp);
		                 x=xtmp.doubleValue();
						 y=ytmp.doubleValue();
						 p=ptmp.doubleValue();
						 w=wtmp.doubleValue();
						 k=ktmp.intValue(); 
		             }
		             else
		             { 
		 				u1=k*ar[0]; 
		 				v1=ai[0];
		                 for (i=2; i<=k; i++)
		                 { 
		 					p=u1*x; 
		 					q=v1*y; 
		 					pq=(u1+v1)*(x+y);
		                     u1=p-q+(k-i+1)*ar[i-1];
		                     v1=pq-p-q+(k-i+1)*ai[i-1];
		                 }
		                 
		 				p=u1*u1+v1*v1;
		                 if (p<=1.0e-20)
		                 { 
		 					it=0;
			 				 Real xtmp = new Real(x);
			 				 Real ytmp = new Real(y);
			 				 Real x1tmp = new Real(x1);
			 				 Real y1tmp = new Real(y1);
			 				 Real dxtmp = new Real(dx);
			 				 Real dytmp = new Real(dy);
			 				 Real ddtmp = new Real(dd);
			 				 Real dctmp = new Real(dc);
			 				 Real ctmp = new Real(c);
			 				 Real ktmp = new Real(k);
			 				 Real istmp = new Real(is);
			 				 Real ittmp = new Real(it);
			                 g65c(xtmp, ytmp, x1tmp, y1tmp, dxtmp, dytmp, ddtmp, dctmp, ctmp, ktmp, istmp, ittmp);
			                 x=xtmp.doubleValue();
							 y=ytmp.doubleValue();
							 x1=x1tmp.doubleValue();
							 y1=y1tmp.doubleValue();
							 dx=dxtmp.doubleValue();
							 dy=dytmp.doubleValue();
							 dd=ddtmp.doubleValue();
							 dc=dctmp.doubleValue();
							 c=ctmp.doubleValue();
							 k=ktmp.intValue(); 
							 is=istmp.intValue();
							 it=ittmp.intValue();
		                     if (it==0) 
		 						continue;
		                     
			 				 Real xtmp1 = new Real(x);
			 				 Real ytmp1 = new Real(y);
			 				 Real ptmp1 = new Real(p);
			 				 Real wtmp1 = new Real(w);
			 				 Real ktmp1 = new Real(k);
				 			 g90c(xr,xi,ar,ai,xtmp1,ytmp1,ptmp1,wtmp1,ktmp1);
			                 x=xtmp1.doubleValue();
							 y=ytmp1.doubleValue();
							 p=ptmp1.doubleValue();
							 w=wtmp1.doubleValue();
							 k=ktmp1.intValue(); 
		                 }
		                 else
		                 { 
		 					dx=(u*u1+v*v1)/p;
		                     dy=(u1*v-v1*u)/p;
		                     t=1.0+4.0/k;
			 				 Real ttmp = new Real(t);
			 				 Real xtmp = new Real(x);
			 				 Real ytmp = new Real(y);
			 				 Real x1tmp = new Real(x1);
			 				 Real y1tmp = new Real(y1);
			 				 Real dxtmp = new Real(dx);
			 				 Real dytmp = new Real(dy);
			 				 Real ptmp = new Real(p);
			 				 Real qtmp = new Real(q);
			 				 Real ktmp = new Real(k);
			 				 Real ittmp = new Real(it);
			 				 g60c(ttmp,xtmp,ytmp,x1tmp,y1tmp,dxtmp,dytmp,ptmp,qtmp,ktmp,ittmp);
			                 t=ttmp.doubleValue();
			                 x=xtmp.doubleValue();
							 y=ytmp.doubleValue();
							 x1=x1tmp.doubleValue();
							 y1=y1tmp.doubleValue();
							 dx=dxtmp.doubleValue();
							 dy=dytmp.doubleValue();
							 p=ptmp.doubleValue();
							 q=qtmp.doubleValue();
							 k=ktmp.intValue(); 
							 it=ittmp.intValue();
		                     if (t>=1.0e-03) 
		 						continue;
		                     
		 					if (g>1.0e-18)
		                     { 
		 						it=0;
				 				 Real xtmp1 = new Real(x);
				 				 Real ytmp1 = new Real(y);
				 				 Real x1tmp1 = new Real(x1);
				 				 Real y1tmp1 = new Real(y1);
				 				 Real dxtmp1 = new Real(dx);
				 				 Real dytmp1 = new Real(dy);
				 				 Real ddtmp1 = new Real(dd);
				 				 Real dctmp1 = new Real(dc);
				 				 Real ctmp1 = new Real(c);
				 				 Real ktmp1 = new Real(k);
				 				 Real istmp1 = new Real(is);
				 				 Real ittmp1 = new Real(it);
				                 g65c(xtmp1, ytmp1, x1tmp1, y1tmp1, dxtmp1, dytmp1, ddtmp1, dctmp1, ctmp1, ktmp1, istmp1, ittmp1);
				                 x=xtmp1.doubleValue();
								 y=ytmp1.doubleValue();
								 x1=x1tmp1.doubleValue();
								 y1=y1tmp1.doubleValue();
								 dx=dxtmp1.doubleValue();
								 dy=dytmp1.doubleValue();
								 dd=ddtmp1.doubleValue();
								 dc=dctmp1.doubleValue();
								 c=ctmp1.doubleValue();
								 k=ktmp1.intValue(); 
								 is=istmp1.intValue();
								 it=ittmp1.intValue();
		                         if (it==0) 
		 							continue;
		                     }
		                     
			 				 Real xtmp1 = new Real(x);
			 				 Real ytmp1 = new Real(y);
			 				 Real ptmp1 = new Real(p);
			 				 Real wtmp1 = new Real(w);
			 				 Real ktmp1 = new Real(k);
				 			 g90c(xr,xi,ar,ai,xtmp1,ytmp1,ptmp1,wtmp1,ktmp1);
			                 x=xtmp1.doubleValue();
							 y=ytmp1.doubleValue();
							 p=ptmp1.doubleValue();
							 w=wtmp1.doubleValue();
							 k=ktmp1.intValue(); 
		                 }
		             }
		             break;
		         }
	         }
	         
	 		if (k==1) 
	 			jt=0;
	         else 
	 			jt=1;
	     }
	     
	 	return true;
	 }
	
	 /**
	  * 内部函数
	  */
	 private void g60c(Real t,Real x,Real y,Real x1,Real y1,Real dx,Real dy,Real p,
	 		Real q,Real k,Real it)
	 { 
	 	 it.setValue(1);
	     while (it.intValue()==1)
	     { 
	 		 t.setValue(t.doubleValue()/1.67); 
	 		 it.setValue(0);
	         x1.setValue(x.doubleValue()-t.doubleValue()*dx.doubleValue());
	         y1.setValue(y.doubleValue()-t.doubleValue()*dy.doubleValue());
	         if (k.intValue()>=30)
	 		{ 
	 			 p.setValue(Math.sqrt(x1.doubleValue()*x1.doubleValue()+y1.doubleValue()*y1.doubleValue()));
	             q.setValue(Math.exp(75.0/k.doubleValue()));
	             if (p.doubleValue()>=q.doubleValue()) 
	 				it.setValue(1);
	         }
	     }
	 }
	
	 /**
	  * 内部函数
	  */
	 private void g90c(double[] xr,double[] xi,double[] ar,double[] ai,Real x,Real y,Real p,Real w,Real k)
	 { 
	 	 int i;
	     for (i=1; i<=k.intValue(); i++)
	     { 
	 		 ar[i]=ar[i]+ar[i-1]*x.doubleValue()-ai[i-1]*y.doubleValue();
	         ai[i]=ai[i]+ar[i-1]*y.doubleValue()+ai[i-1]*x.doubleValue();
	     }
	     
	 	 xr[k.intValue()-1]=x.doubleValue()*w.doubleValue(); 
	 	 xi[k.intValue()-1]=y.doubleValue()*w.doubleValue();
	     k.setValue(k.intValue()-1);
	     if (k.intValue()==1)
	     { 
	 		 p.setValue(ar[0]*ar[0]+ai[0]*ai[0]);
	         xr[0]=-w.doubleValue()*(ar[0]*ar[1]+ai[0]*ai[1])/p.doubleValue();
	         xi[0]=w.doubleValue()*(ar[1]*ai[0]-ar[0]*ai[1])/p.doubleValue();
	     }
	 }
	
	 /**
	  * 内部函数
	  */
	 private void g65c(Real x,Real y,Real x1,Real y1,Real dx,Real dy,Real dd,Real dc,Real c,Real k,Real is,Real it)
	 { 
	 	if (it.intValue()==0)
	     { 
	 		 is.setValue(1);
	         dd.setValue(Math.sqrt(dx.doubleValue()*dx.doubleValue()+dy.doubleValue()*dy.doubleValue()));
	         if (dd.doubleValue()>1.0) 
	 			dd.setValue(1.0);
	         dc.setValue(6.28/(4.5*k.doubleValue())); 
	 		 c.setValue(0.0);
	     }
	     
	 	while(true)
	     { 
	 		 c.setValue(c.doubleValue()+dc.doubleValue());
	         dx.setValue(dd.doubleValue()*Math.cos(c.doubleValue())); 
	         dy.setValue(dd.doubleValue()*Math.sin(c.doubleValue())); 
	         x1.setValue(x.doubleValue()+dx.doubleValue()); 
	 		 y1.setValue(y.doubleValue()+dy.doubleValue());
	         if (c.doubleValue()<=6.29)
	         { 
	 			it.setValue(0); 
	 			return;
	 		}
	         
	 		 dd.setValue(dd.doubleValue()/1.67);
	         if (dd.intValue()<=1.0e-07)
	         { 
	 			it.setValue(1); 
	 			return;
	 		}
	         
	 		c.setValue(0.0);
	     }
	 }
	
	 /**
	  * 求非线性方程一个实根的蒙特卡洛法
	  * 
	  * 调用时,须覆盖计算方程左端函数f(x)值的虚函数double func(double x)
	  * 
	  * @param x - 传入初值(猜测解),返回求得的实根
	  * @param xStart - 均匀分布的端点初值
	  * @param nControlB - 控制参数
	  * @param eps - 控制精度
	  */
	 public void getRootMonteCarlo(Real x, double xStart, int nControlB, double eps)
	 { 
	 	int k;
	 	double xx,a,y,x1,y1,r;
	     
	 	// 求解条件
	 	a = xStart; 
	 	k = 1; 
	 	r = 1.0;
	
	 	// 初值
	 	xx = x.doubleValue(); 
	 	y = func(xx);
	
	 	// 精度控制求解
	     while (a>=eps)
	     { 
	     	Real rtmp = new Real(r);
	 		x1=rnd(rtmp);
	 		r=rtmp.doubleValue();
	
	 		x1=-a+2.0*a*x1;
	         x1=xx+x1; 
	 		y1=func(x1);
	         
	 		k=k+1;
	         if (Math.abs(y1)>=Math.abs(y))
	         { 
	 			if (k>nControlB) 
	 			{ 
	 				k=1; 
	 				a=a/2.0; 
	 			}
	 		}
	         else
	         { 
	 			k=1; 
	 			xx=x1; 
	 			y=y1;
	             if (Math.abs(y)<eps)
	             { 
	 				x.setValue(xx); 
	 				return; 
	 			}
	         }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -