對于一個學生學習平臺(數學),我們設法包含了 Maxima 并評估等價的術語/方程/數字。為此,我們撰寫了一個演算法,為所有變數隨機選擇數字,然后比較兩個結果是否導致相同的值(從數學上講,我們將這些術語視為函式并在特定位置進行比較)。
現在問題來了:不幸的是,必須有可能定義變數系數的范圍。因此,例如在 x=10 位置的正確解 [4,5]x^2-[3,4]x 導致 [4,5]*10^2-[3,4]*10。在這里,我們必須找到這個運算式的最小值/最大值,例如 4 到 5 的范圍作為 x^2 之前的系數。我無法使用原生的 Maxima 函式來做到這一點,所以我在這里尋求幫助。我還想知道這是否可以與其他函式(如 sin、e 等)結合使用,或者這是否會使整個優化問題過于復雜(我們應該只允許多項式)。
非常感謝您的幫助!
最好的,萊昂
uj5u.com熱心網友回復:
總結一下我們在評論中所說的話,我們有類似的東西sum(a[k]*e[k], k, 1, n),其中系數a[k]受區間約束I[k]并且e[k]是 中的運算式x。鑒于這x是一個特定值,那么總和是 的線性組合,a[k]極值位于由區間的笛卡爾積給出的超立方體的角上。
一個簡單的解決方案是僅列舉超立方體的角并評估每個角的總和,看看哪個最大。(如果有關系,這意味著和實際上不是某個系數的函式。給定問題陳述,這意味著對應e[k]的為零。讓我們尋找并省略這些系數,那么只能有一個唯一的最大值。)
這是我對解決方案的嘗試,希望我已經了解正在發生的事情以及需要發生的事情。假設沒有檢查a,e和I都是相同的長度,即n。
find_maximum_corner (a, e, I, x, x1) :=
block ([n, ee, ii_omit, a_omit, ii_keep, a_keep, e_keep, I_keep,
corners_positions, corners_equations, corners_values,
maximum_value, ii_maximum_value],
n: length(a),
ee: subst (x = x1, sum (a[k]*e[k], k, 1, n)),
ii_omit: sublist_indices (e, lambda ([e1], subst (x = x1, e1) = 0)),
a_omit: makelist (a[i], i, ii_omit),
ii_keep: sublist (makelist (i, i, 1, n), lambda ([i1], not member (i1, ii_omit))),
a_keep: makelist (a[i], i, ii_keep),
e_keep: makelist (e[i], i, ii_keep),
I_keep: makelist (I[i], i, ii_keep),
corners_positions: apply (cartesian_product_list, I_keep),
corners_equations: map (lambda ([l], map (lambda ([a1, l1], a1 = l1), a_keep, l)), corners_positions),
corners_values: map (lambda ([eqs], subst (eqs, ee)), corners_equations),
maximum_value: lmax (corners_values),
ii_maximum_value: sublist_indices (corners_values, lambda ([v], v = maximum_value)),
[maximum_value, corners_equations[ii_maximum_value[1]], a_omit]);
這將回傳一個串列,其中包含最大值、總和達到最大值的角點以及省略的變數串列,因為對應的變數在e[k]處為零x = x1。
該解決方案利用了cartesian_product_list最近添加的(在 Maxima 5.43 中)。如果您使用的是 5.43 之前的版本,我可以寫出它的簡單實作。
有了這個解決方案,我得到:
(%i6) find_maximum_corner ([a, b, c], [x, -x^2, x^3], [[3, 4], [-2, 2], [4, 5]], x, 3);
(%o6) [165, [a = 4, b = - 2, c = 5], []]
(%i7) find_maximum_corner ([a, b, c], [x, -(x - 3)^2, x^3], [[3, 4], [-2, 2], [4, 5]], x, 3);
(%o7) [147, [a = 4, c = 5], [b]]
第二個示例顯示了一個變數,該變數因為相應的運算式為零而退出。
運算式不必e[k]是多項式;它們可以是 的任何函式x(前提是subst(x = x1, e[k])簡化為數字 whenx1是一個數字——這是大多數或所有內置數學函式的情況)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406029.html
標籤:
上一篇:繪制位模式時連續兩個錯誤
