| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 555 人关注过本帖
标题:初级用循环求解
只看楼主 加入收藏
obdi00
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-1-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
初级用循环求解
程序代码:
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 编辑 ]
2011-03-24 13:10
sdupoplar
Rank: 2
等 级:论坛游民
帖 子:18
专家分:40
注 册:2011-3-24
收藏
得分:5 
这样是不行的,有专门这方面的算法,
数值逼近、数值代数、数值算法之类的。
数值逼近讲方程、微分方程之类的算法。
数值代数讲矩阵之类的算法。
数值算法是两个的统称。
这些算法理论上都挺复杂的。尤其是误差的估计与计算、收敛的证明之类的。
2011-03-24 15:09
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:15 
没太看明白楼主的意思呀。
y = 2x+0.2, y = sin(x)
这两个都是函数,不是方程呀(至少不是通常意义下人们想研究的)?


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

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


[ 本帖最后由 pangding 于 2011-3-24 23:10 编辑 ]
2011-03-24 22:42
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
解方程组确实要学不少东西。
想输入一个方程,之后全部考计算机自动求解几乎是不可能的。

如果你不是想写一个通用的程序,而是只想算算某个方程的近似解,有时候也不是很难。
比如你这个,利用第一个方程很容易消去一个未知量 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楼指明的方向很正确,我以上提的,也应该可以起到一定的引导作用。
2011-03-24 23:07
obdi00
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-1-22
收藏
得分:0 
谢谢大家的帮助

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

我只是个初学,那些传说中的‘算法’我基本都不知道。 现在我想试的就是继续用for把其中一个的 y 算出来, 再用for算另外一个, 两个y比较
2011-03-25 01:50
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
以下是引用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]
不用用三角函数。
2011-03-25 14:19
obdi00
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-1-22
收藏
得分:0 
感谢pangding!

再问一个问题, C++可以控制小数点吗?
比如说 y = x*0.235324  我可以设定y的精度吗? 如果我只想要3个小数点的精度。
2011-03-27 13:27
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
它不能设置计算精度。用 double 的话,就是用双精度浮点表示,它的精度是有工程标准规定的。现在置顶的那个帖子里提了一点相关知识。

不过输出的精度可以控制。用下面的語句:
cout << setprecision(3) << y << endl;
要 #include <iomanip>
2011-03-28 17:51
快速回复:初级用循环求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036525 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved