为什么总是循环一个数啊,蛋疼

luckyboy123321 2018-04-22 07:37:39

double n ;
double x = -1.5;
double y =11;
double c=0 ;

double e = Math.Pow(10, -5);
Console.WriteLine("T的取值区间在0-0.01");
double a;
double b;
while (true)
{
a = 0;
b =0.005;

while (true)
{
if (F(a, x, y) == 0)
{
Console.WriteLine("此方程的根为a=:{0}", a);
c = a;
break;

}
if (F(b, x, y) == 0)
{
Console.WriteLine("此方程的根为b=:{0}", b);
c = b;
break;
}
if (F(a, x, y) * F(b, x, y) > 0)
{
Console.WriteLine("此方程无解!!!");
Console.WriteLine("F(a, x, y)={0}", F(a, x, y));
Console.WriteLine("F(b, x, y)={0}", F(b, x, y));
break;
}


if (F(a, x, y) * F(b, x, y) < 0)
{
n = (a + b) / 2;

if (F(n, x, y) == 0)
Console.WriteLine("此方程的根为n=:{0}", n);

if (F(a, x, y) * F(n, x, y) < 0)

b = n;

else
a = n;

if (Math.Abs(b - a) < e | Math.Abs(b - a) == e)
{
Console.WriteLine("此方程的根为n=:{0}", n);
c = n;
break;
}
}
}

Console.WriteLine("x={0},y={1}", x, y);
double l = c / (Math.Sqrt(0.01 * 0.01 - c * c)) - 12;
double k = 20 - y + x * c / (Math.Sqrt(0.01 * 0.01 - c * c));
double del = Math.Sqrt(l * l - 16 * k);
if (del < 0)
break;
x = (l + del) / 8;
y = 4 * Math.Pow(x, 2) + 12 * x + 20;



if ( x >10 )
{

x = 10;
y = 4 * Math.Pow(x, 2) + 12 * x + 20;
Console.WriteLine("x={0},y={1}", x, y);
break;

}





}

Console.ReadLine();
}
public static double F(double t, double x, double y)
{
//double u = (Math.Sqrt(0.01 * 0.01 - t * t));
//return 16 * Math.Pow(Math.Pow((0.01 * 0.01 - t * t), 0.5), 3) + 176 * (0.01 * 0.01 - t * t) - 16 * (0.01 * 0.01 - t * t) * y - t * t + 24 * Math.Pow((0.01 * 0.01 - t * t), 0.5) * t + 16 * t * t * Math.Pow((0.01 * 0.01 - t * t), 0.5) + 16 * t * x * Math.Pow((0.01 * 0.01 - t * t), 0.5);
return Math.Pow((t / (Math.Sqrt(0.01 * 0.01 - t * t)) - 12), 2) / 16 - (x + t) * t / (Math.Sqrt(0.01 * 0.01 - t * t)) - 20 + y - (Math.Sqrt(0.01 * 0.01 - t * t));

}



想问一下为啥总是循环一个结果



...全文
830 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-04-25
  • 打赏
  • 举报
回复
x 不是一直在变吗? 但 -1.5 和 -1.49926757494034 到 -1.49926757461259 他们之间的差异是在是太小了,已经没法影响到 F 函数的 t 参数(2.9296875E-05)的作用了 当然你提高 e 的精度,还是可以有所改变的 e = Math.Pow(10, -10) 时 n = 3.33309918642044E-05 但此时 F(n, x, y) 并不等于 0(7.15046951539511E-09 只是很接近了) 但也只能这样,否则你就需要使用高精度数学库了
luckyboy123321 2018-04-25
  • 打赏
  • 举报
回复
大佬帮忙解决一下
luckyboy123321 2018-04-25
  • 打赏
  • 举报
回复
大哥我这个还是不行啊

double x = -1.5;
double y = 11;
double c=0 ;
double a = 0;
double b = 0.01;
double e = Math.Pow(10, -5);


for (int i = 0; i < 10;i++ )
{
while (Math.Abs(b - a) > e)
{
var fa = Math.Sign(F(a, x, y));
var fb = Math.Sign(F(b, x, y));
if (fa == fb) break;
c = (a + b) / 2;
var fc = Math.Sign(F(c, x, y));
if (fb == fc) b = c;
else a = c;
}

Console.WriteLine("x={0}, y={1},n={2}", x, y, c);
Console.WriteLine("");
x = G(c, x, y);
y = 4 * Math.Pow(x, 2) + 12 * x + 20;

}
x = 10;
y = 4 * Math.Pow(x, 2) + 12 * x + 20;
Console.WriteLine("x={0}, y={1}", x, y);
Console.ReadKey();
}
public static double F(double t, double x, double y)
{

return t * t / 16 + 1.5 * t * (Math.Sqrt(0.01 * 0.01 - t * t)) - (Math.Sqrt(0.01 * 0.01 - t * t)) * t * (x + t) + (Math.Sqrt(0.01 * 0.01 - t * t)) * (Math.Sqrt(0.01 * 0.01 - t * t)) * (y - 11 - (Math.Sqrt(0.01 * 0.01 - t * t)));

}
public static double G(double n,double xa,double ya)
{

double d;
double x0 = 0.5 * (xa + 10);
double x1;
x1 = x0 - (4 * x0 * x0 + x0 * (12 - n / (Math.Sqrt(0.01 * 0.01 - n * n))) + 20 - ya + xa * n / (Math.Sqrt(0.01 * 0.01 - n * n))) / (8 * x0 + (12 - n / (Math.Sqrt(0.01 * 0.01 - n * n))));

d = Math.Abs(x1 - x0);
while (d > Math.Pow(10, -10) && x1 >= xa && x1 <= 10)
{
x0 = x1;
x1 = x0 - (4 * x0 * x0 + x0 * (12 - n / (Math.Sqrt(0.01 * 0.01 - n * n))) + 20 - ya + xa * n / (Math.Sqrt(0.01 * 0.01 - n * n))) / (8 * x0 + (12 - n / (Math.Sqrt(0.01 * 0.01 - n * n))));

d = Math.Abs(x1 - x0);


}
return x0;


}


那个n值还是不变啊,要崩溃了
luckyboy123321 2018-04-25
  • 打赏
  • 举报
回复
我是为了求x,y的值啊,通过循环来不断的求x,y的值,形成一个个点,然后画曲线,现在就是由于那个n值不变导致x,y不变求不出其他的点,就不能画线了
xuzuning 2018-04-25
  • 打赏
  • 举报
回复
或者说,你打算要干什么?
xuzuning 2018-04-25
  • 打赏
  • 举报
回复
你想让他变成什么?
xuzuning 2018-04-25
  • 打赏
  • 举报
回复
while (Math.Abs(b - a) > e) 对是 Math.Abs(b - a) > e 不满足了,退出了循环
luckyboy123321 2018-04-25
  • 打赏
  • 举报
回复
对啊,x,y一直在变啊,那你的意思是精度的问题了,导致了,求出来的n的取值不变了
luckyboy123321 2018-04-25
  • 打赏
  • 举报
回复
我把精度提高到-20都没用啊,差不多已经是函数的最高精度了,还是-1.49几,然后n值还是不变
xuzuning 2018-04-24
  • 打赏
  • 举报
回复
可能数学库不一样,64位的肯定不会在用32位的库的
luckyboy123321 2018-04-24
  • 打赏
  • 举报
回复
是的,win1064位
xuzuning 2018-04-24
  • 打赏
  • 举报
回复
你是64位机?
luckyboy123321 2018-04-24
  • 打赏
  • 举报
回复
复制你的二分法那部分
luckyboy123321 2018-04-24
  • 打赏
  • 举报
回复

我用你的程序咋算出来的结果和你不一样啊
xuzuning 2018-04-24
  • 打赏
  • 举报
回复
对,是两部分 18 行起是两分法 是按符号进行判断的,两次计算符号相反,则表示其间一定有过0的点(方程的根) 而你用的算法是百度百科上的,根本无效,应该是作者写反了
luckyboy123321 2018-04-24
  • 打赏
  • 举报
回复
大哥你这个程序是不是包含了两部分,第一个循环是步进算法第二个是二分法是吧
luckyboy123321 2018-04-24
  • 打赏
  • 举报
回复
我是用的二分法啊,你看下我的原方程,上面的主题程序是二分法,下面的是方程的函数,然后通过二分法进行求根,根的取值区间在a,b之间,求出根以后得到下一个x,y的值,再将x,y的值回带回去进行第二次计算,然后在求根,在求x,y的值,一直循环,直到满足要求跳出循环就行了,所以为啥c值会不变啊,还是很懵逼哦
xuzuning 2018-04-23
  • 打赏
  • 举报
回复
低精度直接步进计算就可以
高精度可用两分法计算
        static void Main(string[] args)
{
double x = -1.5;
double y = 11;
double c = 0;
double a = 0;
double b = 0.01;
double e = Math.Pow(10, -5);

while (a < b)
{
if (Math.Sign(F(a, x, y)) != Math.Sign(F(a + e, x, y))) break;
a += e;
}
Console.WriteLine("a={0} b={1} F()={2}", a, b, F(a, x, y));
Console.WriteLine("a={0} b={1} F()={2}", a+e, b, F(a+e, x, y));

a = 0;
e = Math.Pow(10, -17);
while (Math.Abs(b - a) > e)
{
var fa = Math.Sign(F(a, x, y));
var fb = Math.Sign(F(b, x, y));
if (fa == fb) break;
c = (a + b) / 2;
var fc = Math.Sign(F(c, x, y));
if (fb == fc) b = c;
else a = c;
}
Console.WriteLine("a={0} b={1} F()={2}", a, b, F(c, x, y));
}
xuzuning 2018-04-23
  • 打赏
  • 举报
回复
因为 c 第一次赋值后就没有再变过,所以 double l = c / (Math.Sqrt(0.01 * 0.01 - c * c)) - 12; double k = 20 - y + x * c / (Math.Sqrt(0.01 * 0.01 - c * c)); double del = Math.Sqrt(l * l - 16 * k); if (del < 0) break; x = (l + del) / 8; y = 4 * Math.Pow(x, 2) + 12 * x + 20; x、y 都不会变
luckyboy123321 2018-04-23
  • 打赏
  • 举报
回复
但是x,y的值应该变了啊,重新计算c的值应该会变的啊,a,b是求根区间,肯定不变啊,为的就是求c的值也就是那个方程的根,然后回带进去,求出下一个x,y的值,所以哪里该改一下啊
加载更多回复(2)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧