精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《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)