设计思路如下:
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语言编程,二元一次方程组等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)