※ 引述《soshine (繚繞)》之銘言:
: In this program, you are required to input four coefficients (of type integers) a3, a2, a1, a0, of a function
: y(x)= a3*x3 + a2*x2+ a1*x1+ a0
: Then, you have to calculate two starting points a and b such that y(a)*y(b) < 0 . Based on these two points and the bisectio
: n method you are to find an approximation x0 to a zero of the function y(x) such that |y(x0)| < ε, where ε is set to 10-8.
: In this program you have also to declare some functions, such as a function to compute the value of y(x).
: 英文看不懂.......呵呵
: 反正他要的意思是找出一個三次方程式的一個實根位置
: 精確到小數點後第八位
: 並且規定要使用函式來寫.....
: 目前遇到的困難在於找不出一個通則可以用二分逼近來求...
: 在迴圈的邏輯上也搞不太清...
: 救救我吧......
在 cszone po 了兩篇, 才發現這邊也有人問...
所以再從那邊貼過來.
數值方法解三次方程式有兩種解法...
一種是得到很準的解, 因為三次方程式有公式解.
一種是用一些逼近法或是迭代法...
看你們的題意應該是要求用第二種方法,
不過公式解的方法也跟你們講一下, 可以用來檢查.
公式解的方法:
先用平移的方法讓平方項的係數為零,
3
變成 t - 3at - b=0 的樣子...
再令 t=y+z...
3
t = 3yz(y+z)+(y^3+z^3)=3at+b
=> yz=a, (so y^3 z^3=a^3),
y^3+z^3=b,
再來解 y^3 和 z^3... 可得 y,z,
再代回 t=y+z... 就得到解了.
數值的:
還是建議先變成 g(t)=t^3-3at-b=0 的形式.
好處是 g(t->-inf) -> -inf, f(t->+inf)->inf.
而且反曲點在 t=0.
再來判斷 g(0) 是否大於零, 若是則有負根,
若小於零則有正根.
在此都考慮 g(0) < 0 的情形, g(0) > 0 基本上只是反過來而已.
Case 1.
g(0) < 0, g'(0) > 0, 只有一正實根.
可以設兩邊的值分別為 0, pow(-g(0),1./3.)
再用二分逼近法.
Case 2.
g(0) < 0, g'(0) < 0,
可能會只有一正實根, 也有可能有一正實根, 兩負實根. (不考慮重根)
先求出兩個斜率為零的地方, 分別是 sqrt(a) 和 -sqrt(a)
case 2-1. 一正實根
g(-sqrt(a)) < 0,
令 t' = sqrt(a) + d, 代入 g(t),
求一 d 使 g(t') > 0,
可以得到
3 2
d + sqrt(a)*(3d - 2a) - b > 0
所以只要
2
3d - 2a > 0
3
d > b
則 g(t'=sqrt(a)+d) > 0
這樣再用二分逼近法即可.
case 2-2.
g(-sqrt(a)) > 0
正根同樣可以用 2-1 的方法,
負根一的初始兩個值取 -sqrt(a), 0
負根二的初始兩個值取 -t', -sqrt(a)
再加上判斷重根的, 這樣就可以求出全部的實根.
在有重根的附近可能會變得很麻煩, 要小心.
--
★ Origin:
︿︱︿ 小魚的紫色花園
﹀ fpg.m4.ntu.edu.tw (140.112.214.200)