xunuo83127 发表于 2007-8-10 13:21

!!怎么用最快,或者比较快的方法把 y=0 时的 x 点找出来

不知道哪位前辈知道,怎么样用最快,或者比较快的方法把 y=0 时的 x 点找出来,如果我们有公式,那么可以用Newton_Vefahren,但是现在我们没有一个具体的公式,而是一个比较复杂的Modul就是Binomia_Modul,已经用程序写好了,只需要把 x 带入就可以得到 y,但是不能反过来,就是说只能通过 x 求 y,不能通过 y 求 x ,我现在要的是 y = 0 时那个 x 的值,其实就是整个图像与 X 轴 的交点,我目前是这么做的,也模仿 Newton_Verfahren 先给 Schätzwert,然后通过2点直线,求直线与 x轴 的交点,在带回程序把 y 求出看 y 是不是为0,不是就继续往下找 直到找到误差小过7位小数就可以了,但是我的这个程序每次都要找个13到15次,这就很浪费时间,我看有的人用其他编程语言写的差不多3到4次就可以找到,也是用直线的方法,但是我实在看不明白,是什么意思,还有什么中心点,所以想来这里问问前辈们!


图片实在传不上大的来,赫赫!

[ 本帖最后由 xunuo83127 于 2007-8-14 12:25 编辑 ]

eisenstange 发表于 2007-8-10 17:03

不是特别了解,不过想问一下,其他人的起始点和你的一样么?

westermyth 发表于 2007-8-10 19:15

关于这个问题我在国内学过 《计算方法 》这门课,好像属于数值计算问题吧。

你所用的是牛顿迭代法,这类通过逼近来求出方程的近似解的方法还有很多,他们的差异在于逼近速度,当然和函数本身也有关系。

他们的通用流程基本是:1,确定该区间至少有解:f(a)*f(b)<0
                                 2,利用逼近方法缩小区间,牛顿法中通过判断,把引入的新点作为区间的一端,这个新的区间内包含零点。
                                 3,在新区间内接着搜索。

去网上查查牛顿迭代法,应该就能找到相关的资料。好像还有个容格尔什么的方法,忘记了。其实这个方法还是很简单的。仔细多读两遍应该是能搞定的。

westermyth 发表于 2007-8-10 19:24

关于迭代次数的问题,如果方法一样,精度一样的话,应该不会有太大出入。

这里说一个关于值的验证的问题,你说在计算完之后把x再带入原函数来验证,其实这是没有必要的,因为方法是肯定正确的,理论上我们找到的值广义上讲都是函数根的近似值,只是他们的精度不一样而已,所以当你计算出来一个新的近似值后不需要把它代入原函数来验证,而是直接和你上一次逼近得到的近似根来作比较就可以了,如果X(n)-X(n-1)这两个近似根的差值小于你的要求的根的精度,目前是|X(n)-X(n-1)|<10^-7,那么你就可以认为他们是符合条件的根了,或许你的次数比人家多,就出在判断条件上的不同。

eisenstange 发表于 2007-8-10 21:09

牛顿法应该不是稳定的方法,如果函数有多解,那么两个招到的是否是同一个呢?

aileute 发表于 2007-8-10 22:12

你的问题我觉得没办法用netwon-raphson法解,因为你没有derivative。你可以采用bisection法。

aileute 发表于 2007-8-10 22:16

至于收敛速度问题,和你的曲线的有关。当曲线和x轴相加,且在零点附近斜率很大时,收敛速度很快。斜率很小时收敛的很慢。至于不稳定,震荡,都是和曲线的形状有关。如果你对问题具体问题不了解,乱给一个初值的话,这点你是没有办法事先估计到的。

奇朵啊朵 发表于 2007-8-10 22:33

aileute 发表于 2007-8-10 22:38

可以是可以,不过近似,和实际总还是有区别的,你的公式是不是写错了?什么意思可以稍微解释一下吗?是不是欧拉法的公式?
$frage$

奇朵啊朵 发表于 2007-8-10 22:46

aileute 发表于 2007-8-10 22:51

就是欧拉法的公式,问题是 ΔX取多大,和曲线的形状有关,取得好和真实的f'(x)没什么区别,取得差就要命了。我觉得还是bisection法比较适合lz的情况。
bisection也需要估计解的位置,但是一般在工程问题中,这不是很难的事情。

奇朵啊朵 发表于 2007-8-10 22:55

奇朵啊朵 发表于 2007-8-10 22:59

whitetea 发表于 2007-8-10 23:04

看着好亲切呀。。。:(

xunuo83127 发表于 2007-8-14 12:54

谢谢,各位朋友的提点,我总结一下,Newton_Verfahren 是不能用的吧,因为我认为 Newton_Verfahren是必须要有一个公式,不管多复杂的公式,但是必须要有,奇朵啊朵 也给出了公式,但是我的是个相对较复杂的程序,没有具体公式。

[ 本帖最后由 xunuo83127 于 2007-8-14 13:01 编辑 ]

xunuo83127 发表于 2007-8-14 12:57

而我想我要带回验证是因为我每次得到一个 x 的数值,我要将他带回程序,才可以知道这个 x 是不是我要的答安啊,当然这一点是个关键,如果能找到什么简单的方法,就是不用带 x 回原程序就知道 y 是不是合适,那就可以节约很多时间,因为算一次程序就要花时间!

westermyth 这位朋友提出的|X(n)-X(n-1)|<10^-7方法,能不能再给我解释一下啊,如果这个成立那就太好了,很节约时间的,但是我不明白我要求的是 y 近似0,为什么只要 x 之间的差近似0就可以了呢!这叫什么方法啊??

[ 本帖最后由 xunuo83127 于 2007-8-14 13:00 编辑 ]

xunuo83127 发表于 2007-8-14 12:59

最后就是初始 Sch&auml;tzwert 的问题,这个问题我请教了公司里的同事,他说他的方法就是试验了很多遍,大概知道什么情况下,在什么区间里,然后自己定义,反正是自己写的程序,因为这是个存在很多参数的程序,实在找不到类似Newton 还有推算初始值区间的方法!但是我也学他给了很多个区间,但是目前还是在8此到10次之间. 离3,4次还是有一定距离!

aileute 发表于 2007-8-14 18:55

一般iterative的求解比较慢的,为了提高速度,通常有3个停止条件,
第一个是绝对误差条件你的f(x)和0作比较。这个很好理解。
第二个条件是,你看到的那个条件,这是相对误差条件,也就是说你的递推会自动地停止,当这个条件满足的时候。对于那种解收敛的很慢的情况,这个停止条件会起到作用的。(例如曲线在它的零点附近收敛的比较慢。)
最后一个停止条件是最不能让人满意的,就是规定递推的次数。如果在这么多次递推后不论时候得到满意的结果,递推就会自动停止。

[ 本帖最后由 aileute 于 2007-8-14 19:00 编辑 ]

kwang 发表于 2007-8-17 10:37

楼主的问题,如果zielfunktion 连续,建议试试根据你的具体数据自己 modifizierte 一下 newton-verfahren
Intervallhalbierung 启始值间的确定就是个问题

[ 本帖最后由 kwang 于 2007-8-17 10:38 编辑 ]
页: [1]
查看完整版本: !!怎么用最快,或者比较快的方法把 y=0 时的 x 点找出来