回 帖 发 新 帖 刷新版面

主题:一元3次方程

求解一元3次方程


提示:记方程f(x)=0,若寸在2个数X1和X2且X1〈X2,f(x1)*f(x2)<0,则在(X1,X2)之间一定有一个根。


谁能详细解释下提示部分,小弟看不懂,最好有证明,可以的话给出个程序参考,谢谢

回复列表 (共7个回复)

沙发

程序:
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.

板凳

能给些解说吗?

3 楼

仔细看,其实程序不难理解...

4 楼

能简写就点吗?太长了,占空间大

5 楼

需要学到文件何~我还没学到那...

6 楼

.....

7 楼

我的解法(假定 根 在-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.

我来回复

您尚未登录,请登录后再回复。点此登录或注册