24小时热门版块排行榜    

查看: 908  |  回复: 7

smartfx

新虫 (初入文坛)

[求助] 用ansys优化解一个小学数学题 已有2人参与

近来看到一个小学数学题,题目如下:
元旦促销活动,每次购物200元至500元都(不含500元)打九五折。每次购物500元以上打九折。李阿婆为办年货去该中心购物三次,如果第一次和第二次合并一起买,比分开买便宜13.5元,如是三次合并一起买 比分开买便宜39.4元。已知第一次货物价格是第三次的20/31,李阿婆第二次购物用了多少钱?
不小心算错了,正好在学习ansys,那么能否用ansys的优化来解题呢?我是这样做的:
!假设第一二三次单独付款分别为x,y,z,
!前三次单独实际付款分别为rx,ry,rz
!前两次合并付款为secondPurch
!前三次合并付款为thirdPurch
x=100
y=100
z=100
*if,x,gt,200,then
    rx=x*0.95
*else
    rx=x
*endif
*if,y,gt,200,then
    ry=y*0.95
*else
    ry=y
*endif
*if,z,gt,200,then
    rz=z*0.95
*else
    rz=z
*endif
*if,x+y,gt,500,then
    secondPurch=(x+y)*0.9
    *elseif,x+y,gt,200,then
       secondPurch=(x+y)*0.95
    *else
       secondPurch=x+y
*endif
*if,x+y+z,gt,500,then
    thirdPurch=(x+y+z)*0.9
    *elseif,x+y+z,gt,200,then
       thirdPurch=(x+y+z)*0.95
    *else
       thirdPurch=x+y+z
*endif   
condition1=abs(x-20/30*z)
condition2=abs(rx+ry-secondPurch-13.5)
condition3=abs(rx+ry+rz-thirdPurch-39.4)
object=x+y+z
/opt
opclr
opanl,purchase,inp
opvar,x,dv,100,200,1
opvar,y,dv,100,160,1
opvar,z,dv,100,300,1
opvar,condition1,sv,0,0.01,0.001
opvar,condition2,sv,0,0.01,0.001
opvar,condition3,sv,0,0.01,0.001
opvar,object,obj,,,1
optype,subp
opsubp,1000

得到:
X                                 156.404757   
Y                                 131.812270   
Z                                 233.964945   
与答案还是有蛮大差距的,那么怎么样才能获得更准确的结果呢?
回复此楼

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smartfx

新虫 (初入文坛)

送红花一朵
感激不尽
2楼2015-01-30 12:14:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smartfx

新虫 (初入文坛)

感激不尽
3楼2015-01-30 12:14:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

DGE旅行者

新虫 (小有名气)

ANSYS还能做这个
4楼2015-01-31 08:45:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

peterflyer

木虫之王 (文学泰斗)

peterflyer


【答案】应助回帖

感谢参与,应助指数 +1
我觉得应该这么做:
假设第一二三次单独付款在没有折扣的情况下的金额分别为x,y,z,有了折扣后再分别付款时的金额就会为α*x、β*y、γ*z,其中α、β、γ为折扣系数,即:
x∈[0,200)时α=1.00 ;x∈[200,500)时α=0.95;x∈[500,∞)时α=0.90
y∈[0,200)时β=1.00 ;y∈[200,500)时β=0.95;y∈[500,∞)时β=0.90
z∈[0,200)时γ=1.00 ;z∈[200,500)时γ=0.95;z∈[500,∞)时γ=0.90
同理:
x+y∈[0,200)时δ=1.00 ;x+y∈[200,500)时δ=0.95;x+y∈[500,∞)时δ=0.90
x+y+z∈[0,200)时ε=1.00 ;x+y+z∈[200,500)时ε=0.95;x+y+z∈[500,∞)时ε=0.90
由此根据题中所给出的已知条件可列出如下方程:
α*x+β*y=δ*(α*x+β*y)+13.5                                     (1)
α*x+β*y+γ*z=ε*(α*x+β*y+γ*z)+39.4                        (2)
α*x=20/31*γ*z                                                        (3)
利用计算机的循环功能,将所有情况考虑一遍,即α、β、γ、δ、ε五个数分别取1.00、0.95、0.90,在每种情况下分别求解一次方程组(1)+(2)+(3)。如果解出的解与前面的系数取值相符的话就是解,否则不是解。总共要解3^5=243次上面的三元一次线性方程组。有可能存在的解不止一个,也可能无解,要编程序计算后才知道。
5楼2015-01-31 10:22:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smartfx

新虫 (初入文坛)

引用回帖:
5楼: Originally posted by peterflyer at 2015-01-31 10:22:29
我觉得应该这么做:
假设第一二三次单独付款在没有折扣的情况下的金额分别为x,y,z,有了折扣后再分别付款时的金额就会为α*x、β*y、γ*z,其中α、β、γ为折扣系数,即:
x∈[0,200)时α=1.00 ;x∈[200,500)时 ...

Private Sub CommandButton1_Click()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim ri As Double
Dim rj As Double
Dim rk As Double
Dim secondPur As Double
Dim thirdPur As Double
Dim flag As Boolean

flag = False
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""

    For i = 1 To 500 Step 1
        TextBox4.Text = i
        For j = 1 To 500 Step 1
            TextBox5.Text = j
            For k = 1 To 500 Step 1
            TextBox6.Text = k
            
            If k > 500 Then
                rk = 0.9 * k
            Else
                If k > 200 Then
                    rk = 0.95 * k
                Else
                    rk = k
                    
                End If
            End If
            
            If i > 500 Then
                ri = 0.9 * i
            Else
                If i > 200 Then
                    ri = 0.95 * i
                Else
                    ri = i
                End If
            End If
            
            If j > 500 Then
                rj = 0.9 * j
            Else
                If j > 200 Then
                    rj = 0.95 * j
                Else
                    rj = j
                End If
            End If
            
            If i + j > 500 Then
                secondPur = (ri + rj) * 0.9
            Else
                If i + j > 200 Then
                    secondPur = (i + j) * 0.95
                Else
                    secondPur = i + j
                End If
            End If
            
            If i + j + k > 500 Then
                thirdPur = (i + j + k) * 0.9
            Else
                If i + j + k > 200 Then
                    thirdPur = (i + rj + k) * 0.95
                Else
                    thirdPur = i + j + k
                End If
            End If
            
             If Abs(k * 20 / 31 - i) < 0.0001 And Abs(ri + rj - secondPur - 13.5) < 0.0001 And Abs(ri + rj + rk - thirdPur - 39.4) < 0.0001 Then
                flag = True
                TextBox1.Text = ri
                TextBox2.Text = rj
                TextBox3.Text = rk
                Exit Sub
                           
            End If
            
            Next k
           Next j
        Next i
                    
End Sub
我有用vba试过,这个是用excel的vba算的,不过因为正好答案是整数,所以有结果。我用ansys试了好多次,不同的初始值都会造成不同的结果。所以我用ansys的这个算法可能有问题。直接列方程是能求到答案的。因为三次一起付才节省39.4元,所以每次付款不会超多500,不需要243次
6楼2015-01-31 12:20:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sotf

银虫 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
用ANSYS整的?能干这个?不是搞数值模拟的软件吗?
不留遗憾!
7楼2015-01-31 12:53:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smartfx

新虫 (初入文坛)

引用回帖:
7楼: Originally posted by sotf at 2015-01-31 12:53:09
用ANSYS整的?能干这个?不是搞数值模拟的软件吗?

可能不是很合适,不过这段时间在学习,刚好碰到这个题目,试试了。有个用ansys优化搞下面这个问题的算例:ab两地相距()公里,每公里消耗汽油量与速度平方成正比,每小时司机工资(),求最优速度,让成本最小。具体的系数忘了。
8楼2015-01-31 19:16:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 smartfx 的主题更新
信息提示
请填处理意见