注册 登录
编程论坛 C++教室

初级用循环求解

obdi00 发布于 2011-03-24 13:10, 555 次点击
程序代码:
double i, j;
    double A1, A2, Y1, Y2, X1, X2;
    for ( i = 0; i < 3; i++ )
    {
        j = i/100;
        for ( j = 0; j < 1; j+=0.01 )
        {
            A1 = 2*(j+i) + 0.2;
            A2 = sin(j+i);
            if ( A1 == A2 )
            {
                Y1 = A1;
                Y2 = A2;
                X1 = X2 = i+j;
                i = 3;
            }
            //cout << j+i << "  ";
        }
    }
像解一个方程组一样,y = 2x+0.2, y = sin(x), 这样用循环的方法对吗? cmath 里的 sin, 我这样写一定不对了,VC2010E 倒是没报错, 不知道怎么改。 还有就是如果有更复杂的数字,小数点后面的为数如果跟不上, if(A1==A2)就不能实现了,这个情况下还是用for循环加为数还是有其它的办法?

[ 本帖最后由 obdi00 于 2011-3-24 13:12 编辑 ]
7 回复
#2
sdupoplar2011-03-24 15:09
这样是不行的,有专门这方面的算法,
数值逼近、数值代数、数值算法之类的。
数值逼近讲方程、微分方程之类的算法。
数值代数讲矩阵之类的算法。
数值算法是两个的统称。
这些算法理论上都挺复杂的。尤其是误差的估计与计算、收敛的证明之类的。
#3
pangding2011-03-24 22:42
没太看明白楼主的意思呀。
y = 2x+0.2, y = sin(x)
这两个都是函数,不是方程呀(至少不是通常意义下人们想研究的)?


哦,脑子没转过来。你说的是方程组哈~
现在看明白了。

楼主的代码没细看,但思想基本上是一维搜,我觉得可以解这个题。
只要别用 == 换成一定的精度应该可以估出近似解。
比如写 if ( x - y < 1e-5) 之类的试试,可能就行了。


[ 本帖最后由 pangding 于 2011-3-24 23:10 编辑 ]
#4
pangding2011-03-24 23:07
解方程组确实要学不少东西。
想输入一个方程,之后全部考计算机自动求解几乎是不可能的。

如果你不是想写一个通用的程序,而是只想算算某个方程的近似解,有时候也不是很难。
比如你这个,利用第一个方程很容易消去一个未知量 y。而第二个方程就会变为:
2x+0.2 = sin(x)
这是个超越方程,还是比较难解的。


有时候无法给出解析解,就得用数值方法。

常用的方法有几种:
一个是把大家全甩到一边去,f(x) = sin x - 2x - 0.2,然后求这个函数的零点。
由于 sin x 有界,它的解区间很好确定。借助导数判别单调性,还可以进一步缩小区间范围。
之后可以用于就可以用 二分法呀,牛顿切线法 之类的方法找零点。
这两种方法都要用到迭代。
另一种方法是留一个 x 在左边,化成 x = sin x - x -0.2 。
这个式子比较有意思,它似乎表示,有这么一个 x,代到右边一算,还得自己。这样的点叫不动点。
在图形上,表现为右边函数的图像与 y =x 这条直线的交点。
借助不动点定理,可以迭代出这个函数的不动点。但应用不动点定理需要条件,不一定所有的函数都满足。


二元的方程组还好。
就我的知识面,现在的数学也就是
一元线性
一元高次
二元高次(仅在理论方面)
多元线性(就是一次)
多元二次(得有一定的条件,并不是一般的都可以)
这几个方面取得了较好的成果。其它类型的方程组一般都没有很好的解法。

有些方法要求用到对多元函数求梯度(就是导数),从而对函数有一定的要求。不仅如此,数值计算梯度的运算量很大,方法也复杂。
有兴趣的可以自己查阅一些资料。2楼指明的方向很正确,我以上提的,也应该可以起到一定的引导作用。
#5
obdi002011-03-25 01:50
谢谢大家的帮助

另一个想问的就是 Radian = sin ( degree*PI/180 ); Degree = asin ( Radian ) * 180 / PI;
但我现在是要用 y = sin (x); 这个的语法应该怎么写?

我只是个初学,那些传说中的‘算法’我基本都不知道。 现在我想试的就是继续用for把其中一个的 y 算出来, 再用for算另外一个, 两个y比较
#6
pangding2011-03-25 14:19
以下是引用obdi00在2011-3-25 01:50:58的发言:

谢谢大家的帮助

另一个想问的就是 Radian = sin ( degree*PI/180 ); Degree = asin ( Radian ) * 180 / PI;
但我现在是要用 y = sin (x); 这个的语法应该怎么写?

我只是个初学,那些传说中的‘算法’我基本都不知道。 现在我想试的就是继续用for把其中一个的 y 算出来, 再用for算另外一个, 两个y比较

没太明白你的意思。

sin 这个函数,会自动认为 x 是以弧度为单位的。

如果你问的是这两个单位的换算,那是线性的。
360 [degree] = 2pi [radian]
1 [d] = pi/180 [r]
1[r] = 180/pi [d]
不用用三角函数。
#7
obdi002011-03-27 13:27
感谢pangding!

再问一个问题, C++可以控制小数点吗?
比如说 y = x*0.235324  我可以设定y的精度吗? 如果我只想要3个小数点的精度。
#8
pangding2011-03-28 17:51
它不能设置计算精度。用 double 的话,就是用双精度浮点表示,它的精度是有工程标准规定的。现在置顶的那个帖子里提了一点相关知识。

不过输出的精度可以控制。用下面的語句:
cout << setprecision(3) << y << endl;
要 #include <iomanip>
1