打印

一个简单的电路的复杂数学问题

[复制链接]
楼主: ljm810010
手机看帖
扫描二维码
随时随地手机跟帖
21
ljm810010|  楼主 | 2008-11-11 21:40 | 只看该作者 回帖奖励 |倒序浏览

hab2000能否再细算一下

按你X=2Y结果算得Y跟computer00算的一要,都是-0.25K,不合理呀。

使用特权

评论回复
22
香如故| | 2008-11-11 21:58 | 只看该作者

根据13楼的

数学问题,归一化:
U1=1/(1+X);
U2=1/(1+Y);
U3=1/(1+X//Y);
设X>Y,则:
U2-U1=U3-U2=Δ,是要解Δ的极值,而不是解x,y极值
U1=U2-Δ=1/(1+X)------->
      1
X=-----------  -1;
    U2-Δ

U2=1/(1+Y)------------>
    1
Y=-----   -1;
   U2
将XY带入下面的式子
U3=U2+Δ; ------------->1/(1+X//Y)=U2+Δ;
最后只剩下U2和Δ的关系式,就应该可以求出Δ的极值和u2的值
再求XY
计算太麻烦了.




使用特权

评论回复
23
emailli| | 2008-11-11 21:58 | 只看该作者

13楼是错的,详细的计算如下。

看我的计算过程

使用特权

评论回复
24
emailli| | 2008-11-11 21:59 | 只看该作者

答案和验算如下:

R1=    1.2599
R2=    0.7937
R1//R2=    0.48694128847
    
V1=    2.2124872782
V2=    2.7875341473
V3=    3.362607548
    
V3-V2=    0.57507340068
V2-V1=    0.5750468691

使用特权

评论回复
25
emailli| | 2008-11-11 22:04 | 只看该作者

各位的初中数学还有待复习。

这种类似的二元二次特定方程的化简计算在初中的时候我就已经做过很多很多次了。

现在过了10多年,经过半个多小时的演算和验算,我可以自豪的说,我的初中数学还没有忘记。

o(∩_∩)o...哈哈

某些人的高等数学把自己学傻了,啥都用高等数学,导数来计算。

其实是不需要的,有些时候,用特定的方程组化简就可以得到正确的结果了。

使用特权

评论回复
26
emailli| | 2008-11-11 22:07 | 只看该作者

24楼验算和23楼的图有一个小错误,不匹配

就是24楼的V1,V2,V3都需要 23楼的V1,V2,V3乘以5V才是  验算的时候的 电压

使用特权

评论回复
27
emailli| | 2008-11-11 22:09 | 只看该作者

该方程的求解过程可以归类到 丢番图方程 一类

成为不定方程求解

我记得很清楚,我初中的时候就知道了 丢番图 方程 以及这个人

我用 丢番图方程 也做了很多题

使用特权

评论回复
28
ljm810010|  楼主 | 2008-11-11 22:42 | 只看该作者

emailli再查一下

R1=1.8K,R2=1.1K时,电压差可达0.59V,比你的结果大。

使用特权

评论回复
29
原野之狼| | 2008-11-11 22:48 | 只看该作者

emailli

我认为emailli兄的方法是对的...

用高等数学的知识算了半天,越算越复杂,放弃了.

使用特权

评论回复
30
emailli| | 2008-11-11 23:13 | 只看该作者

我演算了一下。的确 是这样的。

R1=    1.8
R2=    1.1
R1//R2=    0.68275862069
    
V1=    1.7857142857
V2=    2.380952381
V3=    2.9713114754
    
V3-V2=    0.59035909446
V2-V1=    0.59523809524

这只能说明一个问题,我们一个前提条件有错误。

那就是在 V3-V1=V1-V2 时,并不是两两相差最大的时候。

我计算出来的V3-V1和V1-V2的确是相等的。由于用的是近似,所以,后面有几位就不相等了。

但是,用1.8K和1.1K这个来计算,得到的结果明显可以看到两个差值不相等。

看来这个问题还不能这么解答啊。

使用特权

评论回复
31
emailli| | 2008-11-11 23:17 | 只看该作者

同时我想到,既然存在一组V2-V1比V3-V2的差值大的解

是否还存在一组 V3-V2比V2-V1 大的解

使用特权

评论回复
32
原野之狼| | 2008-11-11 23:34 | 只看该作者

两两相差最大和差值相等并不等价

emailli的结果是在差值相等的前提下导出的.

关键是 两两相差最大 如何用数学语言来描述?是否可以这样描述:
既然是 两两 那么应该有三个差值,这三个差值再做平均,并求最大值.
实际上是两个差值做平均就行了.
即F(R1,R2)=((U3-U2)+(U2-U1))/2取最大.

对F在R1和R2方向上求偏导,并令其等于零.
解得R1和R2.
当然还得和边界点作比较.


另外,用计算机做穷举仿真的结果不可靠,因为有计算误差,有逼近区间选定的问题.那并不是理论上的解答.

使用特权

评论回复
33
ljm810010|  楼主 | 2008-11-11 23:42 | 只看该作者

两两相差最大和差值相等并不等价

楼上这个观点是对的,两两相等的条件是有无数组解,但在本题中,这无数组解里面,只有一组是差距最大,现在就是要找出这一组解,所以还是要下点功夫。光是三个电阻,可能大家没想到有这么复杂吧!

使用特权

评论回复
34
原野之狼| | 2008-11-12 00:00 | 只看该作者

..

使用特权

评论回复
35
xwj| | 2008-11-12 01:39 | 只看该作者

哈哈,无聊,编个程序穷举一下:

//依次以0.01、0.001、0.0001、0.00001为间隔在上次的最优结果附近搜索所有的可能性

//Keil的浮点数是单精度的(double也是一样),所以只能精确到小数点后面6位
//因此在误差范围内可以有很多个解。
//而最典型的2组结果就是1.105403,1.804127 和1.107604,1.808030,明显有差别,一个V1大一点点,一个V2大一点点:-)


//test31.c

#include <REG52.H>                /* special function register declarations   */
                                  /* for the intended 8051 derivative         */

#include <stdio.h>                /* prototype declarations for I/O functions */


float min(float x,float y)
{
    if(x<y)
        return(x);
    else
        return(y);
}


/*------------------------------------------------
The main C function.  Program execution starts
here after stack initialization.
------------------------------------------------*/

void main (void) {

float r1,r2;
float best_r1,best_r2;
float va,vb;
float maxa,maxb;
unsigned int i,j;


    SCON  = 0x50;                /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 254;                /* TH1:  reload value for 1200 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;                  /* TI:   set TI to send first char of UART    */

  while (1) {
    P1 ^= 0x01;                 /* Toggle P1.0 each time we print */
    printf ("Hello World ");   /* Print "Hello World" */
    
    maxa=maxb=0;
    r1=0.01;
    r2=0.01;
    for(i=0;i<120;i++)
    {
        for(j=i;j<200;j++)
        {
            va=5/(1+r1)-5/(1+r2);
            vb=5/(1+r1*r2/(r1+r2))-5/(1+r1);
            if (min(va,vb) >=min(maxa,maxb))
            {
                maxa=va;
                maxb=vb;
                best_r1=r1;
                best_r2=r2;
                printf ("r1=%f,r2=%f   Va=%f,", r1, r2,va);
                printf ("Vb=%f   maxa=%f,maxb=%f   ", vb,maxa,maxb);
            }
//            printf ("r1=%f,r2=%f   Va=%f,", r1, r2,va);
//            printf ("Vb=%f   maxa=%f,maxb=%f   ", vb,maxa,maxb);
            r2 +=0.01;
        }
        r1+=0.01;
        r2=r1;
    }
    printf ("best_r1=%f,best_r2=%f   ", best_r1, best_r2);
    printf ("best_a=%f,best_b=%f   ",maxa ,maxb );
    
//    r1=best_r1-0.1;
    r1=1.07;
    r2=1.8;
    for(i=0;i<300;i++)
    {
        for(j=i;j<300;j++)
        {
            va=5/(1+r1)-5/(1+r2);
            vb=5/(1+r1*r2/(r1+r2))-5/(1+r1);
            if (min(va,vb) >=min(maxa,maxb))
            {
                maxa=va;
                maxb=vb;
                best_r1=r1;
                best_r2=r2;
                printf ("r1=%f,r2=%f   Va=%f,", r1, r2,va);
                printf ("Vb=%f   maxa=%f,maxb=%f   ", vb,maxa,maxb);
            }
            r2 +=0.001;
        }
        r1+=0.001;
        r2=1.8;
    }
    printf ("best_r1=%f,best_r2=%f   ", best_r1, best_r2);
    printf ("best_a=%f,best_b=%f   ",maxa ,maxb );
    
    r1=best_r1-0.01;
    r2=best_r2-0.02;
    for(i=0;i<200;i++)
    {
        for(j=i;j<500;j++)
        {
            va=5/(1+r1)-5/(1+r2);
            vb=5/(1+r1*r2/(r1+r2))-5/(1+r1);
            if (min(va,vb) >=min(maxa,maxb))
            {
                maxa=va;
                maxb=vb;
                best_r1=r1;
                best_r2=r2;
                printf ("r1=%f,r2=%f   Va=%f,", r1, r2,va);
                printf ("Vb=%f   maxa=%f,maxb=%f   ", vb,maxa,maxb);
            }
            r2 +=0.0001;
        }
//        r1=1.107+(float)(i)/10000;
        r1+=0.0001;
        r2=best_r2-0.02;
    }
    printf ("best_r1=%f,best_r2=%f   ", best_r1, best_r2);
    printf ("best_a=%f,best_b=%f   ",maxa ,maxb );
    
    r1=best_r1-0.001;
    r2=best_r2-0.002;
    for(i=0;i<200;i++)
    {
        for(j=i;j<500;j++)
        {
            va=5/(1+r1)-5/(1+r2);
            vb=5/(1+r1*r2/(r1+r2))-5/(1+r1);
            if (min(va,vb) >=min(maxa,maxb))
            {
                maxa=va;
                maxb=vb;
                best_r1=r1;
                best_r2=r2;
                printf ("r1=%f,r2=%f   Va=%f,", r1, r2,va);
                printf ("Vb=%f   maxa=%f,maxb=%f   ", vb,maxa,maxb);
            }
            r2 +=0.00001;
        }
//        r1=1.107+(float)(i)/10000;
        r1+=0.00001;
        r2=best_r2-0.002;
    }
    printf ("best_r1=%f,best_r2=%f   ", best_r1, best_r2);
    printf ("best_a=%f,best_b=%f   ",maxa ,maxb );
    
    while (1);
  }
}




//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本请访问我的Blog或联系xwjfile@21cn.com

使用特权

评论回复
36
xwj| | 2008-11-12 01:43 | 只看该作者

看看输出的结果:

列出了所有的最大值情况,可以明显看出浮点数计算有误差,但结果是收敛的

使用特权

评论回复
37
xwj| | 2008-11-12 01:47 | 只看该作者

1.12,1.83附近也有极优解,明天再尝试下

俺呼呼去也.....

使用特权

评论回复
38
ljm810010|  楼主 | 2008-11-12 04:35 | 只看该作者

楼上的结果和我的较接近

R1=1.8142521755004
R2=1.11110834952491
Vmax=0.591753231438839

使用特权

评论回复
39
呆板书生| | 2008-11-12 08:19 | 只看该作者

改变一下思维方式

把R1,R2,R3改为串联

使用特权

评论回复
40
HWM| | 2008-11-12 08:31 | 只看该作者

呵呵,看来等间距假设是不成立的。


R3/(R3+R1) = k
R3/(R3+R2) = 2k
R3/(R3+R1//R2) = 3k

解得
R1 = R3/2
R2 = -R3/4

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则