主题:一元3次方程
interegg
[专家分:80] 发布于 2007-08-03 22:38:00
求解一元3次方程
提示:记方程f(x)=0,若寸在2个数X1和X2且X1〈X2,f(x1)*f(x2)<0,则在(X1,X2)之间一定有一个根。
谁能详细解释下提示部分,小弟看不懂,最好有证明,可以的话给出个程序参考,谢谢
回复列表 (共7个回复)
沙发
abcwuhang [专家分:1840] 发布于 2007-08-06 12:14:00
程序:
program t2001_1;
const eps=0.01;
var a,b,c,d:real;
first:boolean;
x1,x2:real;
count:integer;
function f(x:real):real;
begin
f:=d+x*(c+x*(b+x*a));
end;
function root(x1,x2:real):real;
var middle:real;
begin
if (x2-x1)<eps then root:=(x2+x1)/2
else begin
middle:=(x1+x2)/2;
if f(middle)=0 then root:=middle
else if f(x1)*f(middle)<0 then root:=root(x1,middle)
else root:=root(middle,x2);
end;
end;
begin
assign(input,'input1.dat');
reset(input);
readln(a,b,c,d);
close(input);
first:=true;
x1:=-100;x2:=x1+1;
count:=0;
assign(output,'output1.dat');
rewrite(output);
while (count<3) and (x2<=100) do begin
while (count<3) and (f(x1)*f(x2)>0) do begin
x1:=x2;x2:=x1+1;
end;
while (count<3) and ((f(x1)=0) or (f(x2)=0)) do begin
count:=count+1;
if f(x1)=0 then begin
if first then begin write(x1:0:2);first:=false;end
else write(' ',x1:0:2);
x1:=x2;x2:=x1+1;
end
else begin
if first then begin write(x2:0:2);first:=false;end
else write(' ',x2:0:2);
x1:=x2+1;x2:=x1+1;
end
end;
while (count<3) and (f(x1)*f(x2)<0) do begin
count:=count+1;
if first then begin write(root(x1,x2):0:2);first:=false;end
else write(' ',root(x1,x2):0:2);
x1:=x2;x2:=x1+1;
end;
end;
close(output);
end.
板凳
interegg [专家分:80] 发布于 2007-08-07 19:30:00
能给些解说吗?
3 楼
abcwuhang [专家分:1840] 发布于 2007-08-07 22:21:00
仔细看,其实程序不难理解...
4 楼
zhang990 [专家分:60] 发布于 2007-09-16 11:27:00
能简写就点吗?太长了,占空间大
5 楼
zhang990 [专家分:60] 发布于 2007-09-16 11:29:00
需要学到文件何~我还没学到那...
6 楼
10283469 [专家分:0] 发布于 2007-11-14 21:01:00
.....
7 楼
shisutianxia [专家分:630] 发布于 2007-11-15 11:09:00
我的解法(假定 根 在-500---500当然你可改变范围,设置变量控制)
二分法查找,精度也可以调,稍修改,也可以用于高次方程求解,FUNC函数用递归
REPEAT那些用一个函数搞定
program solve;
var a,b,c,d,st1,st2:real;q:integer;flag:boolean;
function func(x:real):real;
begin
func:=x*(x*(x*a+b)+c)+d;
end;
function ans(k1,k2:real):real;
var p:integer;k:real;
begin
if func(k1)>0 then p:=1 else p:=-1;
repeat
k:=(k1+k2)/2;
if func(k)*p>0 then k1:=k else k2:=k;
until abs(k1-k2)<0.0001;
ans:=k;
end;
begin
readln(a,b,c,d);
st1:=-500;st2:=st1;
if func(st1)>0 then q:=1 else q:=-1;
repeat
st2:=st2+0.009;
if q*func(st2)>0 then begin flag:=false;st1:=st2;end
else flag:=true;
until (flag)or(st2>500);
if st2<= 500 then writeln(ans(st1,st2));
q:=-q;
st1:=st2;
repeat
st2:=st2+0.009;
if q*func(st2)>0 then begin flag:=false;st1:=st2;end
else flag:=true;
until (flag)or(st2>500);
if st2<= 500 then writeln(ans(st1,st2));
q:=-q;
st1:=st2;
repeat
st2:=st2+0.009;
if q*func(st2)>0 then begin flag:=false;st1:=st2;end
else flag:=true;
until (flag)or(st2>500);
if st2<=500 then writeln(ans(st1,st2));
end.
我来回复