当数学和编程结合起来的时候,就很有意思了,就有一定的智能化了。
梯度下降法
C#求解2元一次方程改进算法,最优化算法
这篇文章是上一篇文章的后续。
上一篇文章
C#和数学,System.Math,求解2元一次方程组
最优化算法的思路:
找到目标函数
调整参数
使得目标函数到达最小
![d4d7295e3dbe12c2b53dcd7672958cff.png](https://i-blog.csdnimg.cn/blog_migrate/764e6263f3c643afb8cd887b06bf7385.png)
导数是什么?
导数和最小值有什么关系?
导数怎么算?
这是高等数学里面的内容。
有兴趣的可以发来讨论。
当数学和编程结合起来的时候,就很有意思了,就有一定的智能化了。
代码
//x+y=3
//2x+3y=8
//求x和y
using System;
namespace math_example
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Test.JieFangCheng();
}
}
static class Test{
public static void JieFangCheng(){
Console.WriteLine("利用最优化思路来解方程组");
//x+y=3
//2x+3y=8
double x=0;
double xNew=0;//调整后的x
double y1=0;
double y2=0;
y1=3-x;
y2=(8-2*x)/3;
double mubiao=Math.Pow((y1-y2),2);//目标
Console.WriteLine($"刚开始目标是多少:{mubiao}");
Console.WriteLine($"让目标变小");
double daoshu=2*(y1-y2)*(-1+2/3);//求导
double step=10; //step设置为0.01,0.1,1,10看看有什么不同。
xNew=x-daoshu*step;//调整x
y1=3-xNew;
y2=(8-2*xNew)/3;
mubiao=Math.Pow((y1-y2),2);
Console.WriteLine($"调整以后的目标是多少:{mubiao}");//是不是下降了
}
}
}
上面的代码,按照step by step的思路做了讲解。
下面的代码,进行了解方程
//x+y=3
//2x+3y=8
//求x和y
using System;
using System.Collections.Generic;
namespace math_example
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Test.JieFangCheng();
}
}
static class Test{
public static void JieFangCheng(){
Console.WriteLine("利用最优化思路梯度下降法来解方程组");
//x+y=3
//2x+3y=8
int COUNT=600;//调整最大次数
double step=0.1;//调整的步长
double kaojinzero=0.0000000001;
double x_jie=0;
double y_jie=0;
double x=0;//在循环体里面会调整的变量
double y1=0;//
double y2=0;//
double mubiao=0;//目标函数
double daoshu=0;//导数
bool findIt=false;//刚开始没找到
List<double> see_mubiao=new List<double>();
for(int i=0;i<COUNT;i++){
y1=3-x;
y2=(8-2*x)/3;
mubiao=Math.Pow(y1-y2,2);
see_mubiao.Add(mubiao);
if(mubiao<kaojinzero){ //与0的接近程度
x_jie=x;
y_jie=y1;
findIt=true;
Console.WriteLine($"找到了解x={x_jie},y={y_jie}");
break;
} else {
daoshu=2*(y1-y2)*(-1+2/3);
x=x-daoshu*step;//调整x
}
}//跳出循环
if(!findIt){
Console.WriteLine("没有找到合适的解,请再检查一遍");
}
//看看目标变化
foreach(var item in see_mubiao){
Console.WriteLine($"{item}");
}
//如果是用python,或者是R,可以plot出来。就可以看到目标函数在一直下降。
//在c#里面,有没有类似的功能,怎么写呢。
}
}
}