关于求解数学公式的,如果2边都有未知数,应该怎么办阿

birch2002 2006-03-30 06:33:52
如果x=2,y=3,
k=x*(1-((1+y)*k+1)*((1+y)*k+1)),这样的公式怎么解阿,右边的k很难移到左边,编程怎么实现,谢谢
...全文
194 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
huguyue6670 2006-03-30
  • 打赏
  • 举报
回复
等待结果 ,希望楼主 能给出最后的解决方法!!
tufaqing 2006-03-30
  • 打赏
  • 举报
回复
不好意思,刚才只是测试程序,写错了,现在更正:

#include <iostream.h>

// 牛顿迭代法
// f(x) = f(x0) + (x-x0)f'(x0) + ...
// x1 = x0 - f(x0) / f'(x0)

typedef double (*FUN)(double);

// k=x*(1-((1+y)*k+1)*((1+y)*k+1))
double f( double k )
{
int x = 2, y = 3;
double dResult = x * ( 1 - ( ( 1 + y ) * k + 1 ) * ( ( 1 + y ) * k + 1 ) ) - k;
return dResult;
}

double f_( double k )
{
int x = 2, y = 3;
double dResult = x * ( -2 * ( ( 1 + y ) * k + 1 ) * ( 1 + y ) ) - 1;
return dResult;
}

int newton( FUN fun, FUN fun_, double x0, double eps, double * pResult )
{
eps = eps > 0 ? eps : -eps;
double e = eps + 1;
double x1 = x0;

while( e > eps )
{
double x2 = x1 - fun(x1) / fun_(x1);
double et = x2 - x1;
et = et > 0 ? et : -et;
// x0 error
if( et > e )
{
return 0;
}
x1 = x2;
e = et;
}

*pResult = x1;
return 1;
}

int main(int argc, char* argv[])
{
double dResult;
for( int i = -100; i < 100; i += 2 )
{
if( newton( f, f_, i, 0.0001, &dResult ) )
{
cout << dResult << endl;
}
}

return 0;
}
tufaqing 2006-03-30
  • 打赏
  • 举报
回复
牛顿迭代法:

#include <iostream.h>

// 牛顿迭代法
// f(x) = f(x0) + (x-x0)f'(x0) + ...
// x1 = x0 - f(x0) / f'(x0)

typedef double (*FUN)(double);

// k=x*(1-((1+y)*k+1)*((1+y)*k+1))
double f( double k )
{
int x = 2, y = 3;
double dResult = x * ( 1 - ( ( 1 + y ) * k + 1 ) * ( ( 1 + y ) * k + 1 ) ) - k;
return dResult;
}

double f_( double k )
{
int x = 2, y = 3;
double dResult = x * ( -2 * ( ( 1 + y ) * k + 1 ) * ( 1 + y ) ) - 1;
return dResult;
}

int newton( FUN fun, double x0, double eps, double * pResult )
{
eps = eps > 0 ? eps : -eps;
double e = eps + 1;
double x1 = x0;

while( e > eps )
{
double x2 = x1 - f(x1) / f_(x1);
double et = x2 - x1;
et = et > 0 ? et : -et;
// x0 error
if( et > e )
{
return 0;
}
x1 = x2;
e = et;
}

*pResult = x1;
return 1;
}

int main(int argc, char* argv[])
{
double dResult;
for( int i = -100; i < 100; i += 2 )
{
if( newton( f, i, 0.0001, &dResult ) )
{
cout << dResult << endl;
}
}

return 0;
}

输出:
-0.53125
0
birch2002 2006-03-30
  • 打赏
  • 举报
回复
不是很懂阿,好像很麻烦阿
FengYuanMSFT 2006-03-30
  • 打赏
  • 举报
回复
If your problem is:

Solve("k=x*(1-((1+y)*k+1)*((1+y)*k+1))",
"x=2",
"y=3",
"k");

then:

1) You need to know the exact syntax of those expressions
2) Write a parser for them, store the result in a tree form
3) Write code to get the initial values from "x=2", "y=3"
4) Write code to simplify expression given input values
5) Write code to figure out the exact equation you're trying to solve
6) Solve the equation
DrSmart 2006-03-30
  • 打赏
  • 举报
回复
有意思
birch2002 2006-03-30
  • 打赏
  • 举报
回复
谢谢阿,主要没什么思路
birch2002 2006-03-30
  • 打赏
  • 举报
回复
我就是不知道怎么定义阿,如果k=x*(1-((1+y)*k+1)*((1+y)*k+1))这样的式子,应该怎么解阿,能说说思路吗,谢谢.
FengYuanMSFT 2006-03-30
  • 打赏
  • 举报
回复
What is your input?

If "k=x*(1-((1+y)*k+1)*((1+y)*k+1))" is passed as a string to your program, then you need to define the exact syntax allowed for such expressions.
birch2002 2006-03-30
  • 打赏
  • 举报
回复
应该说我的式子比一元二次方程麻烦很多阿
birch2002 2006-03-30
  • 打赏
  • 举报
回复
对阿,这样编程怎么实现阿,能说下,谢谢阿
fanzai 2006-03-30
  • 打赏
  • 举报
回复
1、把两边的k的0、1、2……次幂的系数全都算出来。
2、右边系数都*(-1)加到左边来。
3、看系数非零的k的最高次项是多少次n。
4、根据一元n次方程的解法来解。(都有公式的)

应该可行吧,可以针对各种不同算式。
birch2002 2006-03-30
  • 打赏
  • 举报
回复
是求导的结果阿,没看清楚,谢谢,我试试
birch2002 2006-03-30
  • 打赏
  • 举报
回复
你好tufaqing,谢谢你的代码,你下面的这段代码看得不是很懂
double f_( double k )
{
int x = 2, y = 3;
double dResult = x * ( -2 * ( ( 1 + y ) * k + 1 ) * ( 1 + y ) ) - 1;
return dResult;
}
x * ( -2 * ( ( 1 + y ) * k + 1 ) * ( 1 + y ) ) - 1;这个是怎么出来的,看得不是很懂,谢谢
FengYuanMSFT 2006-03-30
  • 打赏
  • 举报
回复
k=x*(1-((1+y)*k+1)*((1+y)*k+1))

k = (a + b * k) * (c + d * k)
= ac + (b + d) k + kk

ac + (b + d -1)k + kk = 0

一元二次方程

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧