如何用C语言解二元一次方程组

如何用C语言解二元一次方程组,第1张

设计思路如下:

1、问题描述:

给定一个二元一次方程,形如:

a x + b y = c;

d x + e y = f;

x,y代表未知数,a, b, c, d, e, f为参数。

求解x,y。

2、数据规模和约定:

0 <= a, b, c, d, e, f <= 2147483647。

3、设计思路:

二元一次方程组是由两个含有两个未知数的方程组成的,要求解,就要把二元转化为一元。由二元一次方程组的解法思想知,要把二元转化为一元.

实现的功能代码如下:

扩展资料:

C语言解求二元一次方程:(顺序消元法)

“消元”是解二元一次方程的基本思路。所谓“消元”就是减少未知数的个数,使多元方程最终转化为一元方程再解出未知数。这种将方程组中的未知数个数由多化少,逐一解决的想法,叫做消元思想。

实现代码如下:

因为在求解过程中只有数之间的运算,而没有整个式子的运算,因此这种方法被广泛地用于计算机中。

只能穷举,但要你输入集合 ,我这里就是 minX to maxX ,minY to maxY minZ to maxZ 了

不一定都能得到值

三式相加

结果为

x1^2+x2^2+x3^2+y1^2+y2^2+y3^2+z1^2+z2^2+z3^2+3(x^2+y^2+z^2)-2x(x1+x2+x3)-2y(y1+y2+y3)-2z(z1+z2+z3)=r1+r2+r3

程序上整理一下就是

'3(x^2+y^2+z^2)-2x(x1+x2+x3)-2y(y1+y2+y3)-2z(z1+z2+z3)=r1+r2+r3-( x1^2+x2^2+x3^2+y1^2+y2^2+y3^2+z1^2+z2^2+z3^2)

dim t1,t2,t3,t4

t1=r1+r2+r3-( x1^2+x2^2+x3^2+y1^2+y2^2+y3^2+z1^2+z2^2+z3^2)

t2=x1+x2+x3

t3=y1+y2+y3

t4=z1+z2+z3

'3(x^2+y^2+z^2)-2xt2-2yt3-2zt4=t1

dim t =true

for x=minX to maxX

for y=minY to maxY

for z=minZ to maxy

if (3(x^2+y^2+z^2)-2xt2-2yt3-2zt4=t1) then

msgbox("x=" & x & "y=" & y & "z=" & z)

end if

next

next

next

#include<stdioh>

main()

{

double a1,b1,c1,a2,b2,c2,x,y;

printf("请依次输入A1、B1、C1、A2、B2、C2\n");

scanf("%lf%lf%lf%lf%lf%lf",&a1,&b1,&c1,&a2,&b2,&c2);

x=(c1b2-b1c2)/(a1b2-b1a2);

y=(c1a2-a1c2)/(b1a2-a1b2);

printf("x=%lf,y=%lf\n",x,y);

}

这个问题可能很简单,也可能根本解不出来,具体如下:

如果单就你给出的这个方程来说,最简单的办法就是手工解出x,y的解析表达式,然后让计算机去执行具体的运算工作,就你的这个方程来说,应该不难。

如果想实现一个通用的多元方程组求解程序则要分两种情况:

对于线形多元方程组有确定的方法求解,比如线形代数中的高斯消元法、QR分解法等,但是代码量很大,网上有相关的程序代码可以搜索,但也要求你具有一定的线性代数基础知识;

对于非线性多元方程组,理论上没有确定的办法解决,必须视具体情况先将其转化成线性方程组后再求解,但这种转化不是一定可行,有可能根本转不出来,比如你给出的这个方程组就不行。

程序能成功运行,用的高斯消元法

不过没有给出菜单

输入提示信息比较清楚

某次的结果如下:

你要解几元线性方程组:

2

请输入第1行相应的系数:

a[0][0]: 2

a[0][1]: -1

请输入第1行相应的常数:

b[0]: 3

请输入第2行相应的系数:

a[1][0]: 1

a[1][1]: 1

请输入第2行相应的常数:

b[1]: 9

方程组:

2000000X1 - X2= 3000000

X1 + X2= 9000000

该方程组的解为:

x1 = 400

x2 = 500

Press any key to continue

程序如下:

#include <stdioh>

#include <stdlibh>

#include <malloch>

#include <mathh>

int GS(int,double,double ,double);

double TwoArrayAlloc(int,int);

void TwoArrayFree(double );

void main()

{

int i,j,n;

double ep,a,b;

ep = 1e-4;

printf("你要解几元线性方程组:\n");

scanf("%d",&n);

a = TwoArrayAlloc(n,n);

b = (double )calloc(n,sizeof(double));

if(b == NULL)

{

printf("内存分配失败\n");

exit(1);

}

for(i=0;i<n;i++)

{

printf("请输入第%d行相应的系数:\n",i+1);

for(j=0;j<n;j++)

{

printf("a[%d][%d]: ",i,j);

scanf("%lf",a[i]+j);

fflush(stdin);

}

printf("请输入第%d行相应的常数:\n",i+1);

printf("b[%d]: ",i);

scanf("%lf",b+i);

fflush(stdin);

}

printf("方程组:\n");

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

if(a[i][j]>0)

{

if(j>0)printf(" + ");

if(a[i][j]!=1)

printf("%lfX%d",a[i][j],j+1);

else

printf("X%d",j+1);

}

if(a[i][j]<0)

{

if(j>0)printf(" - ");

if(a[i][j]!=-1)

printf("%lfX%d",fabs(a[i][j]),j+1);

else

printf("X%d",j+1);

}

}

printf("= %lf\n",b[i]);

}

if(!GS(n,a,b,ep))

{

printf("不可以用高斯消去法求解\n");

exit(0);

}

printf("该方程组的解为:\n");

for(i=0;i<n;i++)

printf("x%d = %2f\n",i+1,b[i]);

TwoArrayFree(a);

free(b);

}

int GS(int n,double a,double b,double ep)

{

int i,j,k,l;

double t;

for(k=1;k<=n;k++)

{

for(l=k;l<=n;l++)

if(fabs(a[l-1][k-1])>ep)

break;

else if(l==n)

return(0);

if(l!=k)

{

for(j=k;j<=n;j++)

{

t = a[k-1][j-1];

a[k-1][j-1]=a[l-1][j-1];

a[l-1][j-1]=t;

}

t=b[k-1];

b[k-1]=b[l-1];

b[l-1]=t;

}

t=1/a[k-1][k-1];

for(j=k+1;j<=n;j++)

a[k-1][j-1]=ta[k-1][j-1];

b[k-1]=t;

for(i=k+1;i<=n;i++)

{

for(j=k+1;j<=n;j++)

a[i-1][j-1]-=a[i-1][k-1]a[k-1][j-1];

b[i-1]-=a[i-1][k-1]b[k-1];

}

}

for(i=n-1;i>=1;i--)

for(j=i+1;j<=n;j++)

b[i-1]-=a[i-1][j-1]b[j-1];

return(1);

}

double TwoArrayAlloc(int r,int c)

{

double x,y;

int n;

x=(double )calloc(rc,sizeof(double));

y=(double )calloc(r,sizeof(double));

if(!x||!y)

{

printf("内存分配失败\n");

exit(1);

}

for(n=0;n<=r-1;++n)

y[n]=&x[cn];

return (y);

}

void TwoArrayFree(double x)

{

free(x[0]);

free(x);

}

SOR迭代法的Matlab程序

function

[x]=SOR_iterative(A,b)

%

用SOR迭代求解线性方程组,矩阵A是方阵

x0=zeros(1,length(b));

%

赋初值

tol=10^(-2);

%

给定误差界

N=1000;

%

给定最大迭代次数

[n,n]=size(A);

%

确定矩阵A的阶

w=1;

%

给定松弛因子

k=1;

%

迭代过程

while

k

x(1)=(b(1)-A(1,2:n)x0(2:n)')/A(1,1);

for

i=2:n

x(i)=(1-w)x0(i)+w(b(i)-A(i,1:i-1)x(1:i-1)'-A(i,i+1:n)x0(i+1:n)')/A(i,i);

end

if

max(abs(x-x0))

fid

=

fopen('SOR_iter_resulttxt',

'wt');

fprintf(fid,'\n用SOR迭代求解线性方程组的输出结果\n\n');

fprintf(fid,'迭代次数:

%d次\n\n',k);

fprintf(fid,'x的值\n\n');

fprintf(fid,

'%128f

\n',

x);

break;

end

k=k+1;

x0=x;

end

if

k==N+1

fid

=

fopen('SOR_iter_resulttxt',

'wt');

fprintf(fid,'\n用SOR迭代求解线性方程组的输出结果\n\n');

fprintf(fid,'迭代次数:

%d次\n\n',k);

fprintf(fid,'超过最大迭代次数,求解失败!');

fclose(fid);

end

#include<stdioh>

#include<mathh>

#define EQUATION(A, B, m, n, x) (Apow(x, m) + Bpow(x, n) - 1)/ 定义方程/

double A, B, m, n;/方程参数/

void find_extent(double x1, double x2)/找出根所在的区间/

{

double i = 0, j = 0;

x1 = 0;

if(EQUATION(A, B, m, n, 0) > 0)

{

while(EQUATION(A, B, m, n, ++i) > 0 && EQUATION(A, B, m, n, --j) > 0);

x2 = EQUATION(A, B, m, n, i) <= 0 i : j;

}

else

{

while(EQUATION(A, B, m, n, ++i) < 0 && EQUATION(A, B, m, n, --j) < 0);

x2 = EQUATION(A, B, m, n, i) >= 0 i : j;

}

}

/二分法解方程/

/输入参数:根所在区间[x1, x2], 和精度/

double get_result(double x1, double x2, double accuracy)

{

double x = (x1 + x2) / 2;

while(fabs(EQUATION(A, B, m, n, x)) > accuracy)

{

if(EQUATION(A, B, m, n, x) EQUATION(A, B, m, n, x1) > 0)

x1 = x;

else

x2= x;

x = (x1 + x2)/2;

}

return x;

}

int main()

{

double x;

double x1,x2;

scanf("%lf%lf%lf%lf", &A, &B, &m, &n);

find_extent(&x1, &x2);

x = get_result(x1, x2, 000001);

printf("%lf", x);

return 0;

}

以上就是关于如何用C语言解二元一次方程组全部的内容,包括:如何用C语言解二元一次方程组、如何用VB6.0编辑一个程序能够解算方程组:、C语言编程,二元一次方程组等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9512520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存