c语言怎用高斯函数 c语言高斯课堂

用C语言实现瑞利分布,莱斯分布,高斯分布的分布函数

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为常数

用高斯消元法解三元一次方程组,C语言

参阅我的文章:

#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;

}

用C语言编程高斯全主元消元法

//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");

}

C语言用高斯消元法解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();}

}

}

用c语言实现高斯消去法,解三元一次方程组。求具体程序!!

#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;

}


本文名称:c语言怎用高斯函数 c语言高斯课堂
转载源于:http://ybzwz.com/article/doccsdi.html