【C++】辅助C++计算复数(代码解释的很清楚)

发布于:2022-12-31 ⋅ 阅读:(454) ⋅ 点赞:(0)

        数运算法则有:加减法、乘除法,乘积,商,次幂,n次方根,指数,对数,正弦,余弦,模和幅角。两个复数的和依然是复数,它的实部是原来两个复数实部的和,它的虚部是原来两个虚部的和。复数的加法满足交换律和结合律。此外,复数作为幂和对数的底数、指数、真数时,其运算规则可由欧拉公式e^iθ=cos θ+i sin θ(弧度制)推导而得。

 加法法则

复数的加法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,

则它们的和是 (a+bi)+(c+di)=(a+c)+(b+d)i。

两个复数的和依然是复数,它的实部是原来两个复数实部的和,它的虚部是原来两个虚部的和。

复数的加法满足交换律和结合律

即对任意复数z1,z2,z3,有: z1+z2=z2+z1;(z1+z2)+z3=z1+(z2+z3)。

减法法则

复数的减法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,

则它们的差是 (a+bi)-(c+di)=(a-c)+(b-d)i。

两个复数的差依然是复数,它的实部是原来两个复数实部的差,它的虚部是原来两个虚部的差。

乘法法则

规定复数的乘法按照以下的法则进行:

设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i。

其实就是把两个复数相乘,类似两个多项式相乘,展开得: ac+adi+bci+bdi2,因为i2=-1,所以结果是(ac-bd)+(bc+ad)i 。两个复数的积仍然是一个复数。

在极坐标下,复数可用模长r与幅角θ表示为(r,θ)。对于复数a+bi,r=√(a²+b²),θ=arctan(b/a)。此时,复数相乘表现为幅角相加,模长相乘。

除法法则

复数除法定义:满足(c+di)(x+yi)=(a+bi)的复数x+yi(x,y∈R)叫复数a+bi除以复数c+di的商。

运算方法:可以把除法换算成乘法做,在分子分母同时乘上分母的共轭。所谓共轭你可以理解为加减号的变换,互为共轭的两个复数相乘是个实常数。

除法运算规则:

①设复数a+bi(a,b∈R),除以c+di(c,d∈R),其商为x+yi(x,y∈R),

图1 分母实数化

即(a+bi)÷(c+di)=x+yi

∵(x+yi)(c+di)=(cx-dy)+(dx+cy)i

∴(cx-dy)+(dx+cy)i=a+bi

由复数相等定义可知 cx-dy=a dx+cy=b

解这个方程组,得 x=(ac+bd)/(c2+d2) y=(bc-ad)/(c2+d2)

于是有:(a+bi)/(c+di)=(ac+bd)/(c2+d2) +((bc-ad)/(c2+d2))i

        接下来利用C++编出最会计的计算方法。计算代码如下:

//复数的运算类
#include<iostream> 
# include<cmath>
using namespace std;
//复数的计算类
class complex
{
	private:
		double R;	//复数的实部 
		double I;	//复数的虚部
	
	public:
		
		complex(double real=0,double image=0)  //构造函数 
		{
			R=real;
			I=image;
		}
		
		void print()	//复数输出
		{
			cout<<"("<<R<<","<<I<<")" ;    //输出为(R,I)
			return ; 
		 } 
		 
		double Cabs()	//复数的模 
		{
			double y;
			y=sqrt(R*R+I*I);
			return 0;
		}
		
		double angle()	//复数幅角 
		{
			double y;
			y=atan2(I,R);
			return y;
		}
		
		complex operator + (complex& c2)	//复数加法;重载运算符+ 
		{
			complex c;
			c.R=R+c2.R;
			c.I=I+c2.I;
			return c;
		}
		
		complex operator - (complex& c2)	//复数减法;重载运算符-
		{
			complex c;
			c.R=R-c2.R;
			c.I=I-c2.I;
			return c;
		}
		
		complex operator * (complex& c2)	//复数乘法;重载运算符 *
		{
			complex c;
			double p,q,s;
			p=R*c2.R;
			q=I*c2.I;
			s=(R+I)*(c2.R+c2.I);
			c.R=p-q;
			c.I=s-p-q;
			return c;
		}
		
		complex operator / (complex& c2)	//复数除;重载运算符 /
		{
			complex c;
			double p,q,s,w;
			p=R*c2.R;
			q=-I*c2.I;
			s=(R+I)*(c2.R-c2.I);
			w=(c2.R)*(c2.R)+(c2.I)*(c2.I);
			if(w+1.0 !=1.0)
			{
				c.R=(p-q)/w;
				c.I=(s-p-q)/w;
			}
			else 
			{
				c.R=1e+300;
				c.I=1e+300;
			}
			return c;
		}
		
		complex Power(int n)	//复数乘幂
		{
			complex c;
			double r,q;
			q=atan2(I,R);
			r=sqrt(R*R+I*I );
			if(r+1.0 !=1.0)
			{
				r=n*log(r);
				r=exp(r);
			}
			c.R =r*cos(n*q);
			c.I =r*sin(n*q);
			return c;
		} 
		 
		void Root(int n,complex *p)	//复数的 n 次方根
		{
			complex c;
			int k;
			double r,q,t;
			if(n<1)	return ;
			q=atan2(I,R);
			r=sqrt(R*R+I*I);
			if(r+1.0 !=1.0)
			{
				r=(1.0/n)*log(r);
				r=exp(r);
			}
			for(k=0;k<n;k++)
			{
				t=(2.0*k*3.1415926987+q)/n;
				c.R=r*cos(t);
				c.I=r*sin(t);
				p[k]=c;
			}
			 	
		} 
		
		complex Exp()	//复数指数
		{
			complex c;
			double p;
			p=exp(R);
			c.R=p*cos(I);
			c.I=p*sin(I);
			return c;
		} 
		
		complex Log()	//复数对数
		{
			complex c;
			double p;
			p=R*R+I*I;
			p=log(sqrt(p));
			c.R =p;
			c.I =atan2(I,R);
			return c;	
		} 
		
		complex Sin()	//复数正弦
		{
			complex c;
			double p,q;
			p=exp(I);
			q=exp(-I);
			c.R =sin(R)*(p+q)/2;
			c.I =cos(R)*(p-q)/2;
			return c;	
		} 
		
		complex Cos()	//复数余弦
		{
			complex c;
			double p,q;
			p=exp(I);
			q=exp(-I);
			c.R =cos(R)*(p+q)/2;
			c.I =-sin(R)*(p-q)/2;
			return c;	
		} 		
 } ;

接下来对复数进行实力计算,在计算的过程中充分利用类

//实例计算 
#include<iostream>
#include<cmath>
#include"复数运算类.h"
using namespace std;
int main()
{
	int i;
	double a,b;
	complex c1,c2,c3,c,p[5];
	
	cin>>a>>b;	 //输入c1的实部和虚部 
	c1=complex(a,b); cout<<"c1="; c1.print(); cout<<endl;
	
	cin>>a>>b;	 //输入c2的实部和虚部 
	c2=complex(a,b); cout<<"c2="; c2.print(); cout<<endl;
	
	cin>>a>>b;	 //输入c2的实部和虚部 
	c3=complex(a,b); cout<<"c3="; c3.print(); cout<<endl;


	c=c1+c2;
	cout<<"c1+c2="; c.print();cout<<endl; 
	c=c1-c2;
	cout<<"c1-c2="; c.print();cout<<endl; 
	c=c1*c2;
	cout<<"c1*c2="; c.print();cout<<endl;
	c=c1/c2;
	cout<<"c1/c2="; c.print();cout<<endl;
	c=c3.Power(-3);
	cout<<"c3的-5次方="; c.print();cout<<endl;
	cout<<"c3的8次方为:"<<endl;
	c3.Root(8,p);
	for(i=0;i<8;i++)
	{
		p[i].print();
		cout<<endl;	
	} 
	c=c3.Exp();
	cout<<"exp(c3)=";
	c.print();
	cout<<endl;
	
	c=c3.Log();
	cout<<"log(c3)=";
	c.print();
	cout<<endl;
	
	c=c3.Sin();
	cout<<"sin(c3)=";
	c.print();
	cout<<endl;
	
	c=c3.Cos();
	cout<<"cos(c3)=";
	c.print();
	cout<<endl;
	
	return 0;
}

其中第一行为键盘输入

则,计算结果为:


网站公告

今日签到

点亮在社区的每一天
去签到