C语言_源代码-如何用C程序解一元三次方程根
c语言编写程序,求函数一元三次方程在平面直角坐标系内与x轴的交点
c语言编写程序,求函数一元三次方程在平面直角坐标系内与x轴的交点1. 引言1.1 概述在现代科技和工程领域中,数学是一个不可或缺的基础。
一元三次方程是其中一种常见的数学问题,解决这类方程可以帮助我们理解曲线与直角坐标系之间的关系。
本文旨在介绍使用C语言编写程序来求解一元三次方程与x轴交点的方法。
1.2 文章结构本文分为5个主要部分。
首先,在引言部分我们将简要概述文章内容,并介绍每个部分的目的和结构。
其次,在“2. C语言编写程序”部分,将选择适合该问题的程序设计语言,并详细介绍一元三次方程及如何解决它。
接着,在“3. 编写求解一元三次方程交点的C函数”部分,将讨论如何编写具体实现该功能的C 函数,并提供步骤详解。
然后,在“4. 在平面直角坐标系内绘制一元三次方程与x轴的交点图形”部分,将探究绘图工具及图形绘制算法,并附上示例和结果分析。
最后,在“5. 结论与总结”部分,对实验结果进行总结并讨论优化和改进思路。
1.3 目的本文的目的是帮助读者理解并学习如何使用C语言编写函数来求解一元三次方程与x轴交点,并通过绘制图形使其更加直观。
通过阅读本文,读者将能够掌握求解一元三次方程所需的基本步骤和程序设计技巧,并了解绘制相关图形的方法。
此外,我们还将讨论程序优化和改进的思路,以提高程序性能和可扩展性。
总之,通过本文的指导和实践,读者将能够掌握C语言编写解决一元三次方程的函数,并且能够在平面直角坐标系上绘制出这些方程与x轴交点的图形。
2. C语言编写程序2.1 程序设计语言选择在编写解一元三次方程交点的程序时,我们选择使用C语言作为开发工具。
C 语言是一种通用的高级计算机编程语言,它被广泛应用于科学计算、系统开发和嵌入式系统等领域。
C语言拥有简洁的语法和丰富的库函数,能够方便地进行数学运算和图形绘制,非常适合我们求解一元三次方程交点的需求。
2.2 一元三次方程介绍在数学中,一元三次方程是指只含有一个未知数(通常为x)的三次方程。
用C语言解决一元多项式运算问题
用C语言解决一元多项式运算问题摘要本数据结构课程设计运用一元多项式运算的基本法则,对一元多项式的加法、减法运算进行设计,并有人机交换界面。
本课程设计中,系统开发平台为Windows XP;程序设计语言主要采用C语言,其中也掺入了C++部分语句,兼而两者的优势并存;开发环境为Microsoft Visual C++ 6.0,友好的界面、功能更加强大,相比较于C语言的专用开发环境Turbo C,其操作简单却已能完全在其环境中借用C语言开发设计出源程序;程序运行平台为Windows 98/2000/XP,程序兼容特性比较强,具有很好的移植特性。
在程序设计中,整个程序层次结构突出,直观性与易理解性优势明显。
程序通过调试运行后,完成了一元多项式运算的各种操作的设想,符合题目要求,初步实现了设计目标,达到了预期的效果。
关键词:数据结构课程设计; C程序语言;多项式1 引言计算机的快速发展,特别是计算机网络的发展,越来越深刻地改变了人们生活的方方面面。
但同时,也要求人们能高效、有效地完成某些运算任务。
而“数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。
本课程设计主要是对所学的数据结构知识进行整合和运用,解决在一元多项式的运算,包括加法、减法及乘法运算,通过该程序,将大大减少运算时间,提高工作效率。
2 课程设计目的在我们对一个具体的问题进行分析时,往往要抽象出一个模型,设计一个算法来实现所需要达到的功能。
在此程序中,我们主要是综合运用所学过的知识,回顾VC++编程的同时,熟悉并掌握数据结构中的算法分析与设计。
同时,要掌握类C语言的算法转换成C程序并上机调试的基础;这次课程设计,要求设计一个C语言程序,该程序能够按照指数的降幂排列,并完成多个一元多项式的相加、相减、相乘,并将结果输出。
通过这次课程设计,进一步巩固《数据结构》等课程所学的知识,特别加强指针、结构体、文件数据类型的应用,熟悉面向过程的结构化、了解面向对象设计方法,通过本次课程设计的实践,加强动手能力的操作,掌握程序设计的流程,以及用C程序语言编写程序,从而解决实际问题的能力,了解掌握Visual C++开发环境,在老师的指导下,独立完成课程设计的全部内容,培养严谨的科学态度和认真学习的工作作风,培养创造性思维方式。
一元二次、三次及四次方程求根程序代码
#include <stdio.h>#include <math.h>int main(){int n;double a,b,c,d,e;void action1(double a,double b,double c);void action2(double a,double b,double c,double d);void action3(double a,double b,double c,double d,double e);printf("1.AX^2+BX+C=0\n\n2.AX^3+BX^2+CX+D=0\n\n3.AX^4+BX^3+CX^2+DX+E=0\ n\n");do{printf("Please choose 1, 2 or 3:");scanf("%d",&n);}while (n!=1&&n!=2&&n!=3);printf("\n");if (n==1){do{printf("A=");scanf("%lf",&a);}while (a==0);printf("B=");scanf("%lf",&b);printf("C=");scanf("%lf",&c);printf("\n");action1(a,b,c);}if (n==2){do{printf("A=");scanf("%lf",&a);}while (a==0);printf("B=");scanf("%lf",&b);printf("C=");scanf("%lf",&c);printf("D=");scanf("%lf",&d);printf("\n");action2(a,b,c,d);}if (n==3){do{printf("A=");scanf("%lf",&a);}while (a==0);printf("B=");scanf("%lf",&b);printf("C=");scanf("%lf",&c);printf("D=");scanf("%lf",&d);printf("E=");scanf("%lf",&e);printf("\n");action3(a,b,c,d,e);}printf("\nCopyright © Li Lei, All rights reserved.\n");return 0;}void action1(double a,double b,double c){double K,L,S,x1,x2;double det(double a,double b,double c,double d);b=b/2;K=-b/a;L=det(a,b,b,c);if (fabs(L)<=1e-10)printf("x1=x2=%f\n",K);if (L>1e-10){S=sqrt(L);printf("x1=%f-%fi\nx2=%f+%fi\n",K,S,K,S);}if (L<-1e-10){x1=K-sqrt(-L);x2=K+sqrt(-L);printf("x1=%f\nx2=%f\n",x1,x2);}}void action2(double a,double b,double c,double d){double K,L,M,p,q,disc,x1,x2,x3,t1,t2;double curt(double x);double det(double a,double b,double c,double d);b=b/3;c=c/3;K=-b/a;L=det(a,b,b,c);M=det(a,b,c,d);p=L;q=K*L+M/2;disc=q*q+p*p*p;if (fabs(disc)<=1e-10){if (fabs(q)<=1e-10)printf("x1=x2=x3=%f\n",K);else{x1=K+2*curt(-q);x2=K-curt(-q);printf("x1=%f\nx2=x3=%f\n",x1,x2);}}if (disc>1e-10){double m,n;disc=sqrt(disc);t1=-q-disc;t2=-q+disc;t1=curt(t1);t2=curt(t2);x1=K+t1+t2;m=K-(t1+t2)/2;n=sqrt(3)*(t2-t1)/2;printf("x1=%f\nx2=%f-%fi\nx3=%f+%fi\n",x1,m,n,m,n);}if (disc<-1e-10){if (fabs(q)<=1e-10){x1=K-sqrt(-3*p);x2=K;x3=K+sqrt(-3*p);}else{double x;disc=sqrt(-disc);x=atan2(disc,-q);t1=sqrt(-p)*cos(x/3);t2=sqrt(-3*p)*sin(x/3);x1=K-t1-t2;x2=K-t1+t2;x3=K+2*t1;}printf("x1=%f\nx2=%f\nx3=%f\n",x1,x2,x3);}}void action3(double a,double b,double c,double d,double e){double K,L,M,N,P0,Q0,R0,disc,x1,x2,x3,x4,X1,X2,X3,x,S,T;double curt(double x);double det(double a,double b,double c,double d);b=b/4;c=c/6;d=d/4;K=-b/a;L=det(a,b,b,c);M=det(a,b,c,d);N=det(a,b,d,e);P0=6*L;Q0=8*K*L+4*M;R0=3*K*K*L+3*K*M+N;if (fabs(Q0)<=1e-10){P0=P0/2;disc=P0*P0-R0;if (fabs(disc)<=1e-10){if (fabs(P0)<=1e-10)printf("x1=x2=x3=x4=%f\n",K);if (P0>1e-10){S=sqrt(P0);printf("x1=x2=%f-%fi\nx3=x4=%f+%fi\n",K,S,K,S);}if (P0<-1e-10){S=sqrt(-P0);x1=K-S;x3=K+S;printf("x1=x2=%f\nx3=x4=%f\n",x1,x3);}}if (disc>1e-10){X1=-P0-sqrt(disc);X2=-P0+sqrt(disc);if (fabs(X2)<=1e-10){S=sqrt(-X1);printf("x1=x2=%f\nx3=%f-%fi\nx4=%f+%fi\n",K,K,S,K,S);}if (fabs(X1)<=1e-10){S=sqrt(X2);x1=K-S;x4=K+S;printf("x1=%f\nx2=x3=%f\nx4=%f\n",x1,K,x4);}if (X2<-1e-10){S=sqrt(-X1);T=sqrt(-X2);printf("x1=%f-%fi\nx2=%f-%fi\nx3=%f+%fi\nx4=%f+%fi\n",K,S,K,T,K,T,K,S);}if (X1>1e-10){S=sqrt(X1);T=sqrt(X2);x1=K-T;x2=K-S;x3=K+S;x4=K+T;printf("x1=%f\nx2=%f\nx3=%f\nx4=%f\n",x1,x2,x3,x4);}if (X1<-1e-10&&X2>1e-10){S=sqrt(-X1);T=sqrt(X2);x1=K-T;x2=K+T;printf("x1=%f\nx2=%f\nx3=%f-%fi\nx4=%f+%fi\n",x1,x2,K,S,K,S);}}if (disc<-1e-10){disc=sqrt(-disc);x=atan2(disc,-P0);S=pow(R0,1/4.0)*sin(x/2);x1=K-pow(R0,1/4.0)*cos(x/2);x3=K+pow(R0,1/4.0)*cos(x/2);printf("x1=%f-%fi\nx2=%f+%fi\nx3=%f-%fi\nx4=%f+%fi\n",x1,S,x1,S,x3,S,x3,S);}}else{double P,Q,R,i,j,k,m,n,p,q,t1,t2;P=(P0*P0-4*R0)/(6*Q0);Q=-P0/6;R=Q0/8;k=-P;i=det(1,P,P,Q);j=det(1,P,Q,R);p=i;q=k*i+j/2;disc=q*q+p*p*p;if (fabs(disc)<=1e-10&&fabs(q)<=1e-10){x1=K+3*k;x2=K-k;printf("x1=%f\nx2=x3=x4=%f\n",x1,x2);}if (fabs(disc)<=1e-10&&fabs(q)>1e-10){X1=k+2*curt(-q);X2=k-curt(-q);if (X1>1e-10&&X2>1e-10||X1<-1e-10&&X2<-1e-10){x1=K-2*sqrt(X1*X2)+X2;x2=K+2*sqrt(X1*X2)+X2;x3=K-X2;printf("x1=%f\nx2=%f\nx3=x4=%f\n",x1,x2,x3);}if (X1<-1e-10&&X2>1e-10||X1>1e-10&&X2<-1e-10){x1=K-X2;S=K+X2;T=2*sqrt(-X1*X2);printf("x1=x2=%f\nx3=%f-%fi\nx4=%f+%fi\n",x1,S,T,S,T);}}if (disc>1e-10){double r;disc=sqrt(disc);t1=-q-disc;t2=-q+disc;t1=curt(t1);t2=curt(t2);X1=k+t1+t2;m=k-(t1+t2)/2;n=sqrt(3)*(t2-t1)/2;r=m*m+n*n;r=sqrt(r);x=atan2(n,m);if (X1>1e-10){x1=K+r-2*sqrt(X1*r)*cos(x/2);x2=K+r+2*sqrt(X1*r)*cos(x/2);S=K-r;T=2*sqrt(X1*r)*sin(x/2);}if (X1<-1e-10){x1=K-r-2*sqrt(-X1*r)*sin(x/2);x2=K-r+2*sqrt(-X1*r)*sin(x/2);S=K+r;T=2*sqrt(-X1*r)*cos(x/2);}printf("x1=%f\nx2=%f\nx3=%f-%fi\nx4=%f+%fi\n",x1,x2,S,T,S,T); }if (disc<-1e-10){if (fabs(q)<=1e-10){X1=k-sqrt(-3*p);X2=k;X3=k+sqrt(-3*p);}else{disc=sqrt(-disc);x=atan2(disc,-q);t1=sqrt(-p)*cos(x/3);t2=sqrt(-3*p)*sin(x/3);X1=k-t1-t2;X2=k-t1+t2;X3=k+2*t1;}if (X1>1e-10||X3<-1e-10){if (X1>1e-10){x1=K+sqrt(X1*X2)-sqrt(X1*X3)-sqrt(X2*X3);x2=K-sqrt(X1*X2)+sqrt(X1*X3)-sqrt(X2*X3);x3=K-sqrt(X1*X2)-sqrt(X1*X3)+sqrt(X2*X3);x4=K+sqrt(X1*X2)+sqrt(X1*X3)+sqrt(X2*X3);}if (X3<-1e-10){x1=K-sqrt(X1*X2)-sqrt(X1*X3)-sqrt(X2*X3);x2=K-sqrt(X1*X2)+sqrt(X1*X3)+sqrt(X2*X3);x3=K+sqrt(X1*X2)-sqrt(X1*X3)+sqrt(X2*X3);x4=K+sqrt(X1*X2)+sqrt(X1*X3)-sqrt(X2*X3);}printf("x1=%f\nx2=%f\nx3=%f\nx4=%f\n",x1,x2,x3,x4); }if (X1<-1e-10&&X3>1e-10){if (X2>1e-10){S=K-sqrt(X2*X3);T=K+sqrt(X2*X3);m=sqrt(-X1*X3)-sqrt(-X1*X2);n=sqrt(-X1*X3)+sqrt(-X1*X2);}if (X2<-1e-10){S=K-sqrt(X1*X2);T=K+sqrt(X1*X2);m=sqrt(-X1*X3)+sqrt(-X2*X3);n=sqrt(-X1*X3)-sqrt(-X2*X3);}printf("x1=%f-%fi\nx2=%f+%fi\nx3=%f-%fi\nx4=%f+%fi\n",S,m,S,m,T,n,T,n);}}}}double det(double a,double b,double c,double d){return((a*d-b*c)/(a*a));}double curt(double x){return (x>=0?pow(x,1/3.0):-pow(-x,1/3.0));}。
一元三次方程的二分法解法 C++
if((a1*x*x+b1*x+c)>0) tt.k=1;
else tt.k=0;
}
else if(disc==0)
{
tt.x1=tt.x2=-b1/(2*a1);
double x=tt.x1-1;
d3.x2=m.x2+10.0;
while(fx(d3.x1)*fx(d3.x2)>0)
{d3.x1=d3.x2;d3.x2+=10.0;} //右移
d.x1=m.x1;
d.x2=m.x2;
X1=solut_eq(d2.x1,d2.x2);
{
if(fx(x)*fx(m)<0) {n=x;x=(m+n)/2;}
else {m=x;x=(m+n)/2;}
}
}
return x;
}
void co::show() const
{
std::cout<<"X1="<<X1<<'\t'<<"X2="<<X2<<'\t'<<"X3="<<X3<<std::endl;
return 0;
}
}
else if(fx(m.x1)>0&&fx(m.x2)>0) //只有一个根
{
d.x1=m.x2;
d.x2=m.x2+10.0;
while(fx(d.x1)*fx(d.x2)>0)
c语言三元一次函数求解程序
c语言三元一次函数求解程序三元一次函数是指形如f(x) = ax + by + cz + d =0 的方程,其中a,b,c,d为已知常数,且a,b,c不全为0。
解三元一次函数的方法有很多种,可以使用代入法、加减消元法和克莱姆法则等。
下面将详细介绍这些方法的步骤和思路。
1. 代入法:代入法是将一个变量的值用其他变量的表达式代入到方程中,从而减少未知数的个数,最终求得方程的解。
具体步骤如下:设已知方程为:f(x) = ax + by + cz + d = 0根据已知条件,选其中一个变量(一般选x)进行解释,将其它两个变量表示为x的函数,得到两个式子:y = f1(x) = (d - ax - cz) / bz = f2(x) = (d - ax - by) / c然后将f1(x) 和 f2(x)代入原方程中,得到仅包含一个变量x的方程:a·x + b·(d - ax - cz)/b + c·(d - ax - by)/c + d = 0简化该方程并整理得:x = (d·c - b·cz - a·by) / (a^2 + b^2 + c^2)将求得的x带入f1(x) 或 f2(x)中就可以求得y和z的值,从而得到方程的解。
2. 加减消元法:加减消元法是将两个方程相加或相减,使其中一个变量的系数相同,从而简化方程组的求解。
具体步骤如下:将方程组整理为标准形式:f1(x) = a1x + b1y + c1z + d1 = 0f2(x) = a2x + b2y + c2z + d2 = 0选其中一个方程(通常选系数比较小的方程)乘以一个适当的系数,使得两个方程中的某个变量的系数相同,然后将两个方程相加或相减,消去这个变量,得到一个仅包含两个变量的方程。
假设通过乘以系数k,使得y的系数相同,得到:k(a1x + b1y + c1z + d1) = k(a2x + b2y + c2z + d2)展开并整理得到:(a1k - a2)x + (b1k - b2)y + (c1k - c2)z + (d1k - d2) = 0此时方程中y的系数相同,可以看作一个二元一次方程,通过解这个方程得到y和z的值。
一元三次方程求根公式及其Fortran代码
− kπ 3 − 3 R(R) =R = z √ |z| cos( θ+2 ), k = 0, 1, −1 √ 3 − − − − − − − − − − − − − − − − − = |z| √ = α2 + |Δ| √α2 − = α2 + β 3 β 3/2 θ = arccos( |α ) = arccos( z|
其中 Δ 即为三次方程根的判别式,由其容易看出:
当 Δ > 0 时,方程有一个实根 x1 和两个共轭复根 x2 、x3
3 当 Δ = 0 时,有 R1 = R2 = √ α =R ,
− −
若 R ≠ 0 ,方程有一个实根 x1 = −b + 2R 和一个二重复根
x2 = x3 = −b − R
f (x)=
x3 +
3b 2 x 3a
+
6c x 6a
+
2d = 2a
x3 + 3b′ x2 + 6c′ x + 2d ′ =0 形式,为简便我们仍记 α2 − β 3 , R1 = − − − − − − − 3 − √ α + √Δ , R2 = − − − − − − − 3 − √ α − √Δ
Delt = Alph*Alph-Beta*Beta*Beta
============================================================================================
很显然,Δ < 0 的情况最复杂,也很让人迷惑,因为实根必须借助于复数才能求得,这也是 最初要引入复数的原因。由于我没有学过复变函数,下面的说法可能有误,说出来只是为了 帮助大家理解。
怎么用计算机求解一元三次方程
怎么用计算机求解一元三次方程
一元三次方程是指一个变量的三次方程,通常形式为:ax + bx + cx + d = 0。
求解一元三次方程可以通过手算或使用计算机程序完成。
以下是使用计算机求解一元三次方程的步骤:
1. 打开计算器或数学软件,进入计算模式。
2. 输入方程的系数a、b、c、d。
3. 使用计算器或软件的求根功能,求出方程的解。
4. 判断解的有效性,即是否满足原方程。
5. 如果解不符合原方程,则需检查输入系数的正确性,或使用其他方法求解。
总之,使用计算机求解一元三次方程可以大大提高求解的准确性和效率。
但是要注意输入系数的正确性,并且对解的有效性进行判断。
- 1 -。
迭代法解一元三次方程
第一题1、用牛顿迭代法解方程求解任意的三次方程:ax3+bx2+cx+d=0要求a,b,c,d从键盘输入,使用循环方法编程。
解法思路:先把求与X轴交点坐标公式放着免得忘记了x=x1f(x2)—x2f(x1)/f(x2)—f(x1)之后比较x1的y1值和x2的y2值,如果两个为异号,那么两个x之间一定有方程的根如果同号,那么继续输入直到异号为止这个时候用求交点坐标公式求出交点坐标x,它的y值同样代入求出再次比较y与y1值,如果异号那么x与x1之间必有方程根如果同号那么x与x2之间必有方程根循环以上直到y的绝对值小于一个非常小的数,也就近似为0的时候,输出x 值既为方程根……#include<stdio.h>#include<math.h>#include<conio.h>floata,b,c,d;〃定义外部变量,使全局可以调用floatf(floatx)〃x函数{floaty;y=a*x*x*x+b*x*x+c*x+d;returny;floatxpoint(floatxlfloatx2)//求弦与x轴交点坐标{floaty;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));returny;}floatroot(floatxlfloatx2)/求根函数{floatx,y,y1;y1=f(x1);//yl为xl纵坐标do{x=xpoint(x1,x2);〃求x1与x2之间弦与x轴交点赋值于xy=f(x);//代入方程中求得yif(y*y1>0)/判断y与y1是否同号{x1=x;y1=y;}elsex2=x;}while(fabs(y)>=0.00001);//设定精度return(x);}voidmain()〃主函数{floatx19x2,f19f2,x;printf("请输入一元三次方程标准形式ax A3+bx A2+cx+d=0中");printf("abcd的值,用空格隔开\n");scanf("%f%f%f%f",&%&b,&c,&d);//获取abcd值并赋值do{printf("输入x1x2值,用空格隔开:\n");scanf("%f%f",&x1,&x2);f1=f(x1);f2=f(x2);if(f1*f2>=0)printf("x1x2之间无方程根,请重新输入\n");}while(f1*f2>=0);〃do・・・while函数为了得到x1与x2的函数值为异号,这样x1x2中才有根x=root(x1,x2);〃将x1x2送到求根函数中返回值赋到x中prints方程中的一个根为%g\n=);getch();}我们以abcd分别等于1,2,3,4为例子(在vc环境下)。
C语言程序设计-程序举例求一元二次方程根
3-3 程序举例-求一元二次方程根
示例代码
main() {
float a,b,c,delta,x1,x2,realpart,imagpart; printf("please input three number:"); scanf("%f,%f,%f",&a,&b,&c); if(a= =0)
if(b= =0) printf("is not root");
else printf("has distinct real roots:%7.3f\n",-c/b);
else{ delta=b*b-4*a*c; if(delta= =0) printf("has two equal root:%7.3f\n",-b/(2*a)); else
if(delta>0) { x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); printf("has distinct real roots:%7.3f,%7.3f\n",x1,x2); }
程序举例-求一元二次方程根
ห้องสมุดไป่ตู้
用二分法解一元三次方程的C++程序
printf("input 2 numbers again:\n");
printf("x0=");
scanf("%lf",&x0);
printf("x1=");
scanf("%lf",&x1);
f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];
f1=x1*x1*x1+a[0]*x1*x1+a[1]*x1+a[2];
}
do
{
xm=(x0+x1)/2;
fm=xm*xm*xm+a[0]*xm*xm+a[1]*xm+a[2];
if(f0*fm>0)
x0=xm;
else
x1=xm;
}while(fabs(x0-x1)>1e-6);
r[i]=(x0+x1)/2;
printf("Ok, next!\n");
}//三次循环找三个根。
#include<stdio.h>
#include<math.h>
void main()
{
double x0,x1,xm,f0,f1,fm,x2,x3;//x2,x3是驻点,x0,x1,xm,f0,x1是二分法求根的工具。
double a[3],r[3];
inti,j=0;
printf("input 3 coefficients:\n");
printf("x0=");
scanf("%lf",&x0);
c语言求三次方程的根程序设计
沈阳理工大学机械工程学院计算机程序训练任务书姓名崔晓光班级08010131学号18日期:2010/06/15目录一设计题目............................ . (3)二设计要求 (3)三技术要求 (3)(1)题目内容的描述 (3)(2)应用程序详细说明 (3)(3)输入数据类型、格式和内容限制 (4)(4)主要模块的算法描述 (4)(5) 结束语 (6)(6) 程序的源代码清单 (6)一设计题目求3次方程的根二设计要求已知有一方程ax3+bx2+cx+d=0,方程系数a,b,c,d由键盘输入(要求a,b,c,d 都不能等于零,如果有零从新输入),求其3个根。
三技术要求1 按照给定题目,独自设计程序,上机调试通过。
2 设计报告(1)题目内容描述:设计一程序算出一元三次方程的根(2)应用程序功能详细说明#include<> : 把使用数学库函数时所需的信息包含进来;#include <> :控制台的输入输出;float a, b, c, d : 定义外部变量,是全局都可以使用;float f(float):定义f函数,以实现f(x)=ax^3+bx^2+cx+d ;float xpoint(float x1 ,float x2):定义xpoint函数,求出弦与x轴的交点;float root :定义roop函数,求近似根;do... While : 循环;void main():主函数;fabs:求绝对值的函数,对实数型求绝对值的标准函数;while(fabs(y)>= ) : 设定精度;if(): 判定所给定的条件是否满足根据判断的结果(真或假)决定执行给出两种操作之一;while() :用来实现“当型”循环结构;printf() :printf的一般形式为printf(格式控制,输出列表)例如:printf(“%d,%c\n”,i,c),括号内包括两部分:a格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:a:格式说明。
用迭代法解一元三次方程的C++程序
#include<stdio.h>#include<math.h>void main(){double a[3],r[3],x0,x1,f0,f1,fd,x2,x3,f2,f3;//a[i]是系数,x0,x1,f0,f1是迭代法的工具,fd是判别二次方程根存在性的中间量。
x2,x3是驻点,f2,f3是驻点的函数值。
int i,j=0;printf("input the 3 coefficients:\n");for(i=0;i<3;i++){printf("a[%d]=",i);scanf("%lf",a+i);}printf("so the function is:\n");printf("x*x*x+%.2f*x*x+%.2f*x+%.2f=0\n\n\n\n",a[0],a[1],a[2]);//raise the question//3*x*x+2*a[0]*x+a[1]fd=4*a[0]*a[0]-12*a[1];if(fd<0)//方程无驻点{x1=0;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);printf("the only root of the function is %.9f.\n",x1);if(fabs(x1*x1*x1+a[0]*x1*x1+a[1]*x1+a[2])<1e-7)printf("congratulations! the answer is right!\n");}else//方程有驻点(驻点全部大于零,驻点全部小于零,驻点一个大于零一个小于零,驻点有零点){x2=(-2*a[0]-sqrt(fd))/6;x3=(-2*a[0]+sqrt(fd))/6;f2=x2*x2*x2+a[0]*x2*x2+a[1]*x2+a[2];f3=x3*x3*x3+a[0]*x3*x3+a[1]*x3+a[2];printf("x2=%.2f\nx3=%.2f\nf2=%.2f\nf3=%.2f\n\n\n\n",x2,x3,f2,f3);if(f2>0&&f3>0)//驻点全部大于零{x1=x2-1;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);printf("the only root of the function is %.9f.\n",x1);if(fabs(x1*x1*x1+a[0]*x1*x1+a[1]*x1+a[2])<1e-7) printf("congratulations! the answer is right!\n"); }else if(f2<0&&f3<0)//驻点全部小于零{x1=x3+1;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);printf("the only root of the function is %.9f.\n",x1);if(fabs(x1*x1*x1+a[0]*x1*x1+a[1]*x1+a[2])<1e-7) printf("congratulations! the answer is right!\n");elseprintf("sorry, you should try again.\n");}else if(f2>0&&f3<0)//驻点一个大于零一个小于零{x1=x2-1;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);r[0]=x1;x1=(x2+x3)/2;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);r[1]=x1;x1=x3+1;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);r[2]=x1;printf("there are 3 roots, they are:\n");for(i=0;i<3;i++)printf("r[%d]=%.9f\n",i,r[i]);for(i=0;i<3;i++)if(fabs(r[i]*r[i]*r[i]+a[0]*r[i]*r[i]+a[1]*r[i]+a[2])<1e-7) j++;if(j==3)printf("congratulations! the answer is right!\n");elseprintf("sorry, you should try again.\n");}else//驻点有零点,有重根{if(f2==0&&f3!=0)//x2是二重根{r[0]=r[1]=x2;x1=x3+1;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);r[2]=x1;}else if(f3==0&&f2!=0)//x3是二重根{r[1]=r[2]=x3;x1=x2-1;do{x0=x1;f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];f1=3*x0*x0+2*a[0]*x0+a[1];x1=x0-(f0/f1);}while(fabs(x0-x1)>1e-9);r[0]=x1;}else//f2=f3=0,x2是三重根{r[1]=r[2]=r[0]=x2;}//输出功能printf("the roots of the function are:\n");for(i=0;i<3;i++)printf("r[%d]=%.9f\n",i,r[i]);//检测功能for(i=0;i<3;i++)if(fabs(r[i]*r[i]*r[i]+a[0]*r[i]*r[i]+a[1]*r[i]+a[2])<1e-7)j++;if(j==3)printf("congratulations! the answer is right!\n");elseprintf("sorry, you should try again.\n");}}}。
c语言求三次方程的根程序设计
沈阳理工大学机械工程学院计算机程序训练任务书姓名崔晓光班级 08010131学号 18日期:2010/06/15目录一设计题目............................ . (3)二设计要求 (3)三技术要求 (3)(1)题目内容的描述 (3)(2)应用程序详细说明 (3)(3)输入数据类型、格式和内容限制 (4)(4)主要模块的算法描述 (4)(5) 结束语 (6)(6) 程序的源代码清单 (6)一设计题目求3次方程的根二设计要求已知有一方程ax3+bx2+cx+d=0,方程系数a,b,c,d由键盘输入(要求a,b,c,d都不能等于零,如果有零从新输入),求其3个根。
三技术要求1 按照给定题目,独自设计程序,上机调试通过。
2 设计报告(1)题目内容描述:设计一程序算出一元三次方程的根(2)应用程序功能详细说明#include<math.h> : 把使用数学库函数时所需的信息包含进来;#include <conio.h> :控制台的输入输出;float a, b, c, d : 定义外部变量,是全局都可以使用;float f(float):定义f函数,以实现f(x)=ax^3+bx^2+cx+d ;float xpoint(float x1 ,float x2):定义xpoint函数,求出弦与x轴的交点;float root :定义roop函数,求近似根;do... While : 循环;void main():主函数;fabs:求绝对值的函数,对实数型求绝对值的标准函数;while(fabs(y)>= ) : 设定精度;if(): 判定所给定的条件是否满足根据判断的结果(真或假)决定执行给出两种操作之一;while() :用来实现“当型”循环结构;printf() :printf的一般形式为printf(格式控制,输出列表)例如:printf(“%d,%c\n”,i,c),括号内包括两部分:a格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:a:格式说明。
三次方程求解
cout<<"x2="<<z[2][0]<<z[2][1]<<"*i"<<endl;
}
else if(n==4)
{
cout<<"方程有3个根:\n";
cout<<"x1="<<z[0][0]<<endl;
if(z[1][1]>=0)
cout<<"x2="<<z[1][0]<<"+"<<z[1][1]<<"*i"<<endl;
}
else
{
cout<<"方程有3个根:\n";
cout<<"x1="<<z[0][0]<<'\t'<<"x2="<<z[1][0]<<'\t'<<"x3="<<z[2][0]<<endl;
}
}
int CCube::cuberoots(void)
{
const double a2third=a[2]/3,q=a[1]/3-a2third*a2third;
{
double s[2];
disc=r+sqrt(disc);
s[1]=-q/(s[0]=cbrt(disc));
z[0][0]=s[0]+s[1]-a2third;
用c解一元三次及一元四次方程
现等。
5.如果程序在运行的过程中,对于一个循环语句,如果你返回的
值始终是真的,那么程序将进如死循环。
6. 未注意 int,float 型数据的数值范围,int 型数据的数值范
围(-32768~32768)。
7.对应该有花括弧的复合语句,忘记加花括弧。
3.1 运行界面图展示...............................................5
4 程序设计结果与分析...............................................7
5 小结.............................................................8
几天的时间没有一点进展。这时候,我一般是先自己通过书本,手册
和资料找解决办法,实在没辙才向老师同学请教。
在开始编写程序的时候,我看到别人的程序功能非常的详细,而
且界面非常漂亮,总是希望自己的程序也非常的完善,但是,发现编
一个好的程序不是一蹴而就的事情,需要长时间的积累和经验。
在反反复复的学习中,我终于作出一个简单的程序。由于我的知
断f(x1).f(x2)的符号:若f(x1).f(x2)<0,则方程的根应在[x1,x2]中,
用 x0 代 替 ,x2,f(x0) 代 替 f(x2) ; 若 f(x1).f(x2)<0, 则 方 程 的 根 应 在
[x1,x2]中,用x0代替x1,f(x0)代替f(x1).在新的区间[x1,x2]中,根的
}
13
用二分法求解,二分法的基本思想是利用中间值定理,即对于实系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
请输入变量的初值 x=5 方程的根 x=1.000000 下面运行程序求一下方程 2 x3 − 24 x + 18 = 0 的根.根据一元三次方程 判别式,此方程有三个不等的实根 [3] .我们从[-3,3]逐个取整数作为初 值来试一下. 请输入方程系数 a,b,c,d:2,0,-24,18 请输入变量的初值 x=-3 方程的根 x=-3.791288/* x1 =-3.791288*/ 再运行一次: 请输入方程系数 a,b,c,d: 2,0,-24,18 请输入变量的初值 x=-2 此时 f '' (−2) = 0 ,故要求输出下一个 x*/ 请输入变量的初值 x=-1 方程的根 x=0.791288/* x 2 =0.791288*/ 再运行一次: 请输入方程系数 a,b,c,d: 2,0,-24,18 请输入变量的初值 x=0 方程的根 x=0.791288 再运行一次: 请输入方程系数 a,b,c,d: 2,0,-24,18 请输入变量的初值 x=1 方程的根 x=0.791288
do {x0=(x1+x2)/2; f0=a*x0*x0*x0+b*x0*x0+c*x0+d; if(f==0)break; if(f0*f1<0) {x2=x0;f2=f0;} else {x1=x0;f1=f0;} }while(fabs(f0)>=1e-5); loop:printf("方程的根 x=%f\n",x0); } 下面运行程序看一下: 请输入方程系数 a,b,c,d: 2,5,8,23 请输入变量的有效范围 x1,x2:-5,5 方程的根 x=-2.636943 再运行一次: 请输入方程系数 a,b,c,d:3,5,9,1 请输入变量的有效范围 x1,x2:-4,5 方程的根 x=-0.118339 再运行一次: 请输入方程系数 a,b,c,d:3,5,8,6 请输入变量的有效范围 x1,x2:-2,2
的实根,但由于方程的实根是 c,故 c1 =c,即 xn → c1 (n → ∞) .进一步由等 式 xn = xn −1 −
f ( xn −1 ) f (x ) ,得到 xn −1 − xn = ' n −1 ,而 f ' ( xn−1 ) 除了至多两个值 ' f ( xn −1 ) f ( xn −1 )
f ( xn −1 ) ,得 f ( xn−1 ) = f ' ( xn−1 ) ( xn −1 − xn ) , f ' ( xn −1 )
两端分别取 n → ∞ 时的极限,当 f ' ( xn −1 ) ≠ 0 时,既得 f (c1 ) = f ' (c1 )(c1 − c1 ) , 显然 f ( xn −1 ) = 0, 即 f (c1 ) = 0 , 所以 c1 为 f ( x) = 0 即 f (c1 ) = 0; 当 f ' ( xn −1 ) = 0 时,
f ( x2 ) ,过( x 2 , f ( x2 ) )点作 f(x)的切线,交 x 轴于 x3 ,将其作为第
三次近似根,再由 x3 求出过 f ( x3 ) ,过( x3 , f ( x3 ) )点再作 f(x) 的切 线,……如此继续下去,直到 xn 十分接近方程的根 c 为止。 由设定的 x 1 容易得到 x 2 ,因为点( x1 , f ( x1 ) )处的切线方程是
方程的根 x=-1.000000 再运行一次: 请输入方程系数 a,b,c,d:-1,1,-1,1 请输入变量的有效范围 x1,x2:0,2 方程的根 x=1.000000 下面运行程序求一下方程 2 x3 − 24 x + 18 = 0 的根. 根据一元三次方 4]逐个取整数作为 程判别式, 此方程有三个不等的实根 [3] .我们从[-4, 初值来试一下. 请输入方程系数 a,b,c,d:2,0,-24,18 请输入变量的有效范围 x1,x2:-3,4/*由 f (−3) f (4) > 0, 故重新取值*/ 请输入变量的有效范围 x1,x2:-2,4 请输入变量的有效范围 x1,x2:-1,4 请输入变量的有效范围 x1,x2:0,4 请输入变量的有效范围 x1,x2:1,4 方程的根 x=3.000000/*x2=3 为准确根,可不再取 3 这个端点*/ 再运行一次: 请输入方程系数 a,b,c,d:2,0,-24,18 请输入变量的有效范围 x1,x2:2,4 方程的根 x=3.000000 再运行一次: 请输入方程系数 a,b,c,d:2,0,-24,18 请输入变量的有效范围 x1,x2:-3,2/*可不取 3 的[3,4]和[-3,3],直接取
x0 代替 x1 , f ( x0 ) 代替 f ( x1 ) .在新的区间 [ x1 , x2 ] 中,根的范围已比开始时
缩小了一半,对新的区间 [ x1 , x2 ] 重复上述过程,由此可得一系列区间:
[a1 , b1 ],[a2 , b3 ],[a3 , b3 ],L ,[an , bn ], 其中后一区间都是前一区间的一半,区间 [an , bn ] 的长度为 bn − an = b−a , 当 n 足够大时,使得 bn − an 足够小,我 2n
f1=a*x2*x2*x2+b*x2*x2+c*x2+d; if(f1==0)break; f2=3*a*x2*x2+2*b*x2+c; if(f2==0)gotoloop; x1=x2-f1/f2; }while(fabs(x2-x1)>=1e-6); print("方程的根 x=%f\n",x1); } 下面运行程序看一下: 请输入方程系数 a,b,c,d:2,5,8,23 请输入变量的初值 x=5 方程的根 x=-2.636943 再运行一次: 请输入方程系数 a,b,c,d:3,5,9,1 请输入变量的初值 x=10 方程的根 x=-0.118339 再运行一次: 请输入方程系数 a,b,c,d:3,5,8,6 请输入变量的初值 x=5 方程的根 x=-1.000000 再运行一次: 请输入方程系数 a,b,c,d:-1,1,-1,1
f '' ( x1 ) > 0 时, x1
= b[2] .这样既可放心地求出方程的一个根来.而
在实际操作中,即使刚好取到了使 f '' ( x1 ) = 0 的 x1 也不要紧,本程序会 提示重新取新的 x1 .故在此程序中,为了提高程序运行速度,没有规 定 x1 的取值范围. 下面给出用切线法求一元三次方程 ax3 + bx 2 + cx + d = 0(a ≠ 0) 近似 根的 c 语言程序 [4] . # include <math.h> main() {float a,b,c,d; float x1,x2,f1,f2; printf("请输入方程系数 a,b,c,d;"); scanf("%f,%f,%f,%f",&a,&b,&c,&d"); loop:printf("请输入变量的初值 x="); scanf("%f",&x1); do {x2=x1;
以外,均不等于零,故要使 f ( xn −1 ) → 0, 只需 xn −1 − xn 足够小即可,由此 推得切线法的可行性.
x1 可以凭经验设定, 但为了避免刚好取到使 f ' ( x1 ) = 0 的 一般来说, x1 ,也可给出 x1 的一个取值范围[a,b],使得 f(a)f(b)<0,且 f '' ( x1 ) < 0 时, x1 = a;
们即可取 x0 =
an + bn 作为方程 f ( x0 ) = 0 的近似根.因为若设 c 为方程 2 b−a 成 2n
f ( x0 ) = 0 的根,则显然有 an ≤ c ≤ bn , an ≤ x0 ≤ bn , 故 x0 − c ≤ bn − an =
立,所以 f ( x0 ) → f (c) = 0(n → ∞), 由此推得二分法的可行性。 二分法是求实根的近似计算中行之有效的最简单的办法, 它只要 求函数是连续的即可,使用范围很广,且便于在计算机上实现.但是 它不能求重根,也不能求虚根 [2] . 下面给出用二分法求一元三次方程 ax3 + bx 2 + cx + d = 0(a ≠ 0) 近似 根的 c 语言程序 [4] . # include <math.h> main() {float a,b,c,d; float xo x1,x2,f0 f1,f2; printf("请输入方程系数 a,b,c,d;"); scanf("%f,%f,%f,%f",&a,&b,&c,&d"); do {printf("请输入变量的有效范围 x1,x2:"); scanf("%f,%f",&x1,&x2); f1=a*x1*x1*x1+b*x1*x1+c*x1+d; if(f1==0){x0=x1;goto loop;} f2=a*x2*x2*x2+b*x2*x2+c*x2+d;; if(f2==0){x0=x2;goto loop;} }while(f1*f2>0);
[-3,2]*/ 方程的根 x=0.791288/*x3=0.791288*/ 到此为止,我们求出了方程 2 x3 − 24 x + 18 = 0 的所有三个实根. 2 再看用切线法求解。切线法的基本思想是把一段不长的 曲线 弧用这段弧上某点处的切线来近似代替,如此反复,直到切线和弧线 在 x 轴上的交点的差的绝对值小于给定的小数为止 [3] 。具体做法是: 先设定一个值 x1 作为第一次近似根,由 x1 求出 f ( x1 ) ,过( x1 , f ( x1 ) )点 作 f(x)的切线,交 x 轴于 x 2 ,将其作为第二次近似根,再由 x2 求出