重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C语言中的random函数可以产生均匀分布的随机变量分布区间为(0,1),假设x1,x2是由random产生的随机变量,
垦利ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
则y=sqrt(-2*ln(x1))为瑞利分布
theta=2*pi*x2为(0,2*pi)的均匀分布
n1=y*cos(theta),n2=y*sin(theta)为两个独立的正太分布
z=sqrt((a+n1)^2+(b+n2)^2),为莱斯分布,a ,b为常数
参阅我的文章:
#include "stdafx.h" //VS 预编译头文件,其他系统请删除
#includestdio.h
#includestdlib.h
#includememory.h
#includemath.h
#includetime.h
//VS 2013 否决了 scanf 等函数,为了使用,加上下句。
//其他系统请删除
#pragma warning(disable:4996)
int GaussJordanElimination(int n, const double *pCoef, double *pOut);
//VS 主函数签名格式。其他系统请改变签名,如:
//int main()
int _tmain(int argc, _TCHAR* argv[])
{
double cf[3][4] = { {-0.02, 2.0, 2.0, 0.4}, {1.0, 0.78125, 0.0, 1.3816}, {3.996, 5.526, 4.0, 7.4178} };
double rs[3];
int i;
i = GaussJordanElimination(3, (double*)cf, rs);
printf("x1 = %lf, x2 = %lf, x3 = %lf\n", rs[0], rs[1], rs[2]);
system("pause"); //避免窗口一闪而退
return 0;
}
//绝对值函数
__inline double _abs(double v)
{
return v 0 ? -v : v;
}
//线性方程组列主元高斯消元法
//n 方程元数;pCoef 系数,必须以行主序方式存放的二维数组;
//pOut 长度为 n 的一维数组(调用者负责维护),用于输出数据
//返回值:0 成功,-1 无解,1 申请内存失败, 2 不定解。
int GaussJordanElimination(int n, const double *pCoef, double *pOut)
{
double *pcf;
int rows = n, columns = n + 1;
//pcf = new double[rows * columns];
pcf = (double*)malloc(rows * columns * sizeof(double));
if (pcf == 0) return 1; //巧妇难为无米之炊,内存都申请不到,还能干嘛!
memcpy(pcf, pCoef, (rows * columns) * sizeof(double)); //据说这个运行效率很高
int r, c, i; //循环变量
int a, b;
double x, y;
//开始消元,将 pcf 方阵区处理成到直角三角形(直角在右上角)矩阵
for (r = 0; r rows - 1; r++)
{
//选取主元
a = r; x = _abs(pcf[r * columns + r]);
for (i = r + 1; i rows; i++)
{ //查找主元在哪行
if (x _abs(pcf[i * columns + r])) a = i;
}
if (a r)
{ //主元不是当前行(r),比较麻烦,需要将第 a 行与第 r 行兑换
//第 r 列前面的就不要对换了,因为这些项已经被消元,变成 0 了
for (c = r; c columns; c++)
{
x = pcf[r * columns + c];
pcf[r * columns + c] = pcf[a * columns + c];
pcf[a * columns + c] = x;
}
}
//开始消元
a = r * columns; //记住将主元的行地址偏移量,以提高程序运行效率
x = -pcf[a + r]; //要多次使用,记下她,以提高程序运行效率
if (x == 0) //主元居然为 0,纯粹是想坑爹,岂能上当!
continue; //继续后面的消元,以便最终判断是无解还是任意解
for (i = r + 1; i rows; i++)
{ //正在消元
b = i * columns;//记住将要消元的行地址偏移量,以提高程序运行效率
y = pcf[b + r]; //要多次使用,记下她,以提高程序运行效率
if (y != 0)
{ //y == 0,本行不需要消元
y /= x; //要多次使用,记下她,以提高程序运行效率
pcf[b + r] = 0; //肯定为 0,不用计算。
for (c = r + 1; c columns; c++)
pcf[b + c] += pcf[a + c] * y;
}
}
}//至此,pcf 方阵区已经处理成到直角三角形(直角在右上角)矩阵
//回代,将 pcf 方阵区处理成主对角线为 1,其他为 0 的矩阵
int columns_1 = c = columns - 1; //多次用到,提高效率
for (r = rows - 1; r = 1; r--)
{
b = r * columns;
if (pcf[b + r] == 0)
{ //经过前面的消元,除主元外,其他元应该都为 0
if (pcf[b + columns_1] == 0)
{ //常数项为 0,方程有不定解
free(pcf);
return 2;
}
else
{ //常数项为 0,方程有无解
free(pcf); //释放内存
return -1;
}
}
pcf[b + columns_1] /= pcf[b + r];
pcf[b + r] = 1; //肯定为 1,不用计算。
y = -pcf[b + columns_1];
//回代
for (i = r - 1; i = 0; i--)
{
pcf[i * columns + columns_1] += pcf[i * columns + r] * y;
pcf[i * columns + r] = 0; //已经回代,此项已消,置为 0。
}
}
//处理第一行数据
pcf[columns_1] /= pcf[0];
pcf[0] = 1;
//至此,回代过程结束,pcf 矩阵的最后一列就是结果
//返回结果
for (r = 0; r rows; r++)
pOut[r] = pcf[r * columns + columns_1];
free(pcf);
return 0;
}
//TurboC 2.0太落后了,建议使用VC++6.0。
#include"stdio.h"
#include"math.h"
//最大49阶
#define N 50
void Gauss(float U[N][N],int n);
void main()
{
int n,i,j;
float U[N][N];
printf("------------特殊说明---------------\n");
printf("当输出的数据含有-1.#IND时,表示在计算过程中数据已经出现溢出!\n");
printf("-----------------------------------\n");
printf("输入对应方程的阶数:");
scanf("%d",n);
for(i=0;iN;i++)
for(j=0;jN;j++)
U[i][j]=0;
printf("输入方程组的增广矩阵:\n");
for(i=0;in;i++)
for(j=0;j=n;j++)
scanf("%f",U[i][j]);
Gauss(U,n);
}
//高斯选列主元消去法
void Gauss(float U[N][N],int n)
{
int i,j,m,row;
float max,t,sum;
float result[50];
for(m=0;mn-1;m++)
{
//选取主元
max=U[m][m];
for(i=m;in;i++)
{
if(fabs(max)fabs(U[i][m]))
{
max=U[i][m];
row=i;
}
}
if(fabs(max)0.01)
{
printf("主元接近于零,方法失效!\n");
return;
}
else
{
if(max!=U[m][m])
{
for(j=m;j=n;j++)
{
t=U[m][j];
U[m][j]=U[row][j];
U[row][j]=t;
}
}
}
//消元
for(i=m+1;in;i++)
{
float t1,t2;
t1=U[i][m];
t2=U[m][m];
U[i][m]=0;
for(j=m+1;j=n;j++)
U[i][j]=U[i][j]*t2-U[m][j]*t1;
}
}
//回代求解
for(i=n-1;i=0;i--)
{
if(i==n-1) result[i]=U[i][i+1]/U[i][i];
else
{
sum=0;
for(j=i+1;jn;j++)
sum=U[i][j]*result[j]+sum;
result[i]=(U[i][n]-sum)/U[i][i];
}
}
//输出根
printf("高斯选列主元消去法求得的解为:\n");
for(i=0;in;i++)
printf("%3.3f ",result[i]);
printf("\n");
}
#includemath.h
#includestdio.h
#includestdlib.h
#includeconio.h
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0d
float A[NUMBER][NUMBER+1] ,ark;
int flag,n;
void exchange(int r,int k);
float max(int k);
void message();
int main()
{
float x[NUMBER]; /*此数组用于存放方程解*/
int r,k,i,j;
char celect;
system("cls");
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.解方程组请按Enter.");
printf("\n\n2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n 输入方程组的维数:n=");
scanf("%d",n);
printf(" \n\n现在输入系数矩阵A和向量b:");
for(i=1;i=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=1;j=n+1;j++) /*将刚才输入的数存入数组*/
scanf("%f",A[i][j]);
}
for(k=1;k=n-1;k++)
{
ark=max(k);
if(ark==0) /*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i=n;i++)
for(j=k+1;j=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k=1;k--)
{
float me=0;
for(j=k+1;j=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();
return 1;
}
void exchange(int r,int k) /*交换行的矩函数*/
{
int i;
for(i=1;i=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i=n+1;i++)
A[k][i]=A[0][i];
}
float max(int k) /*比校系数大小的函数*/
{
int i;
float temp=0;
for(i=k;i=n;i++)
if(fabs(A[i][k])temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}
void message() /*实现菜单选择的函数*/
{
printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的输入!");message();}
}
}
#includeiostream
#includecmath
using namespace std;
#define MAX 50
void input(double a[MAX][MAX+1],int n)
{
cout"输入原方程组的增广矩阵"endl;
for(int i=0;in;i++)
for(int j=0;jn+1;j++)
cina[i][j];
}
void output(double x[],int n)
{
cout"Gauss 消去法得到的原方程组的解为"endl;
for(int k=0;kn;k++)
coutx[k]" ";
}
int main()
{
double a[MAX][MAX+1],x[MAX],sum,max,t;
int n,i,j,k,max_i;
cout"输入原方程组的阶"endl; cinn;
input(a,n);
for(k=0;kn-1;k++)//选主元素
{ max=a[k][k];
max_i=k;
for(i=k+1;in;i++)
if(fabs(a[i][k])fabs(max))
{
max=a[i][k];
max_i=i;
}
if(max==0)
break;
if(max_i!=k)//交换两行
for(j=k;jn+1;j++)
{
t=a[k][j];
a[k][j]=a[max_i][j];
a[max_i][j]=t;
}
for(i=k+1;in;i++)
{
a[i][k]=a[i][k]/-a[k][k];
for(j=k+1;jn+1;j++)
a[i][j]=a[i][j]+a[i][k]*a[k][j];
}//消元
}
if(max==0)cout"原方程组无解"endl;
else
{
for(k=n-1;k=0;k--)
{
sum=0;
for(j=k+1;jn;j++)
sum=sum+a[k][j]*x[j];
x[k]=(a[k][n]-sum)/a[k][k];
}//回代
output(x,n);
coutendl;
}
return 0;
}